国科大软件安全原理期末复习笔记
1 软件安全总论
1.软件的三大特性:复杂性、互连性、可扩展性;
2.基本概念:缺陷、漏洞、风险
- 缺陷(bug):软件在设计和实现上的错误;
- 漏洞(vulnerability):漏洞是可以导致系统安全策略被违反的缺陷;
- 软件漏洞挖掘 Software Vulnerability Analysis (VA):软件漏洞挖掘是通过测试、代码分析、形式化验证等方法发现软件漏洞的过程
- 风险(risk):安全风险是攻击者利用系统漏洞或人员漏洞影响系统正常功效的概率。
3.基本概念:安全软件、软件安全
- 安全软件:指实现安全功能的模块或软件;
- 软件安全:是一个系统级问题,包括安全机制:比如访问控制、认证加密等;以及使软件能够抵御攻击的软件工程化方法,比如使攻击难以实施的健壮设计;
4.编译过程:预处理、编译、汇编、链接;
5.ELF 二进制文件中常见的section:
- .bss 段:Block Started by Symbol的简称,BSS段属于静态内存分配,用来存放程序中未初始化的全局变量的一块内存区域;
- .data/.data1 段:存放程序中已初始化的全局变量的一块内存区域,静态内存分配;
- .rodata/.rodata1段:保存着只读数据;
- .text 代码段:存放程序执行代码的一块内存区域;
- .debug 段:保存着为符号调试的信息,如:变量名,函数名,结构体等;
- .init 段:该节保存着可执行指令,它构成了进程的初始化代码。当一个程序开始运行时,在main函数被调用之前(c语言中称为main),系统安排执行这个节的中的代码。
- .plt 段:过程链接表(Procedure Linkage Table);
- .got 段:全局的偏移量表(Global offset table) ;
6.小端序、大端序
7. 堆栈
函数栈
2 软件安全基本原理
软件安全的目标:允许对软件进行预期的操作,阻止任何非预期的操作
非预期操作:有可能因非预期使用计算机资源而带来危害。
系统安全基本原则
1.身份认证:
- 核实某人是否是其所宣称的人的过程;
- 分类:某人知道什么(知识)、某人拥有什么(所有权)、某人是什么(特征)
- 身份认证方式:口令、生物特征因子、属性、多因子认证
2.访问控制:
- 访问控制:是一种安全手段,它控制用户和系统如何与其它系统和资源进行通信和交互,从而保护系统和资源免受未授权访问。
- 访问:在主体和客体之间进行的信息流动,包括读取、增加、删除、修改信息内容及其属性。
- CIA:保密性 Confidentiality、完整性 Integrity、可用性 Availability;
隔离原则
隔离 (Isolation):对系统中两个组件进行相互隔离,并通过将两者之间的交互限制在清晰设定(well-defined)的API之内。
安全监视器(Security Monitor):以比各隔离组件更高权限运行,监视并确保各组件遵循隔离要求。
进程抽象通过以下两种机制实现隔离:用户态与内核态两种不同特权运行模式、虚拟内存地址空间。
- 进程抽象:
- 进程 (Process)是一个程序的执行过程。是操作系统的基本执行单元。
- 虚拟内存地址空间(virtual memory address space):操作系统的内存管理单元 (Memory Management Unit, MMU)负责管理虚拟内存。MMU通过页表(page table)机制管理虚拟内存,并将虚拟内存空间划分为用户空间和内核空间。进程只能运行在虚拟地址空间中,而无法直接访问物理内存。
- 用户态(user mode)与内核态 (kernal mode):
- 内核态是操作系统运行在特权级别最高的模式下,具有访问系统资源和执行特权指令的能力。内核态进程可以访问内核空间和该进程的用户空间。
- 用户态是应用程序运行在较低特权级别下的模式。用户态进程只能访问其用户空间。
- 虚拟机、容器:
- SFI (Software-based Fault Isolation):一种纯软件的故障隔离方法,可在同一地址空间内不同模块间实现故障隔离。
最小权限原则
- 最小权限原则(Principle of least privilege):系统中每个组件或用户都只须拥有完成任务所需的最小权限集合。
区域化原则
- 区域化(Compartmentalization):将一个系统的各部分区隔开,以阻止失效(malfunction)或故障在各部分之间传播。
威胁模型与威胁建模
威胁模型(Threat model):用于明确列出危害一个系统的安全的所有威胁。
威胁建模(Threat modeling):对一个系统的所有潜在威胁进行枚举并按优先级排序的过程。
内存与类型安全
-
软件为何存在安全问题?
- 1.过分依赖开发者的“自觉”;2:将程序控制信息和数据混为一谈;3:将数据和元数据混为一谈;4:不负责内存初始化和清理;
-
基于编程语言的安全 (Language-based Security,LS) 是指由编程语言提供的特性或机制,这些特性或机制有助于构建安全的软件。
- 内存安全 (Memory Safety)、类型安全 (Type Safety);
-
内存安全 (Memory safety) 确保程序中的指针总是指向有效的内存区域或内存对象。
- 缺乏边界检查或指针算术操作失误导致的缓冲区溢出 (Buffer Overflow)
- 空指针解引用 (Null Pointer Dereference) 导致的程序崩溃
- 悬空指针 (Dangling pointer)、内存泄露(Memory Leak)、释放后使用(Use After Free)、双重释放 (Double Free)
- 堆内存没有初始化导致的程序错误
空间内存安全 (Spatial Memory Safety) 确保在程序中对指针的所有解引用(dereference) 都在所指向内存对象的有效边界之内(简言之,确保不越界读写)
时间内存安全(Temporal memory safety) 确保在程序中,所有对指针的解引用行为在进行时,指针所指向的内存对象都是有效的
- 类型安全:类型安全是编程语言中的一种概念,它为每个分配的内存对象赋予一个类型,被赋予类型的内存对象只能在期望对应类型的程序点使用。
软件安全攻击手段
- 攻击向量 vs 攻击面
攻击向量是攻击者用来对信息系统进行攻击的方法或手段,典型的有钓鱼邮件、失陷凭证、弱口令等; 攻击面是企业所有资产上面临的所有攻击向量的总和。
- 拒绝服务攻击、信息泄露
- 特权提升 (Privilege escalation) 是指利用操作系统或应用软件中的程序错误、设计缺陷或配置疏忽来以更高的权限访问被程序或用户保护的资源。其结果是,应用程序可以获取比应用程序开发者或系统管理员预期的更高的特权。
- 远程代码执行 RCE (Remote Code Execution)
- 本地权限提升LPE (Local Privilege Escalation)
提权手段:控制流劫持 (Control-flow Hijacking) 攻击、命令注入 (Command Injection) 攻击
- 困惑代理人 (Confused deputy) 问题:Confused Deputy 是一个具有较高权限的程序,它被另一个具有较低权限的程序或用户欺骗,以滥用其在系统上的(更高的)权限,这是一类特殊的提权攻击。
- Shellcode:shellcode 是软件漏洞利用载荷 (payload) 中的一小段代码。之所以称其为“shellcode”,是因为它通常会在受攻击主机上启动一个shell 程序,攻击者可通过它在被攻击的主机上执行任意命令,任何执行类似任务的攻击代码都可称为 shellcode。
栈溢出漏洞
ret2text
ret2shellcode
ROP
返回导向编程 (Return-Oriented Programming, ROP) 是一种非常重要的漏洞利用技术,该漏洞利用技术允许攻击者在目标程序 启用了 DEP 的情况 下劫持程序控制流。
return-to-libc
- 竞争条件漏洞:当一个程序的两个并发线程同时访问共享资源时,如果执行时间和顺序不同,会对结果产生影响,这时就称作发生了竞争条件。竞争条件漏洞(Race Condition Vulnerability)程序存在的因发生竞争条件而违反安全策略的缺陷或(逻辑)错误。
软件安全防御策略
-
软件验证(Software Verification)根据给定的规格说明(specification)证明代码正确性的过程。
-
验证过程:对安全限定条件(constraint),如“不能违反内存或类型安全要求”进行编码,
并作为配置(configuration)参数提供给验证器。 -
对于一个存在漏洞的软件,漏洞缓解(Mitigation)措施可以使其漏洞利用变得更难,但不会修复漏洞,因此漏洞依然存在于软件中。
DEP
- 内存页的权限可以通过 mprotect() 系统调用改变;
- JIT (Just in Time Compilation) 即时编译需要在程序运行过程中生成代码并执行,在存在即时编译机制的程序中,可写可执行的内存页是很常见的;
地址空间布局随机化 ASLR
PIC (position-independent code): 是一种可以在任何内存位置执行的代码,常用于动态链接库(回顾:在 ASLR下动态链接库的加载地址发生了变化,但每次都可以正常运行)。
PIE 是一种用于可执行程序、特殊类型的 PIC,它允许 ELF 可执行程序被系统加载至内存空间的任何位置并正常执行。
栈完整性保护
Fortify Source
将危险函数替换为可自动检查缓冲区边界的对应函数,以防止简单的缓冲区溢出和格式化字符串漏洞
控制流完整性
控制流完整性 (CFI) 是一种软件漏洞缓解机制,用于保护程序免受控制流劫持攻击,成功的 CFI 确保程序的控制流永远不会离开其预定义的有效控制流,这意味着攻击者将无法重定向控制流至任意位置。
代码指针完整性 (Code-Pointer Integrity)
基于编程语言的安全
Rust 采用 Region-based Memory Management,在对象所属 region 的生命周期结束时释放对象。Rust 所有权机制的主要目的是管理堆数据。Rust 编译器通过追踪所有权,将运行时可能产生的错误转换为了编译时的报错。
软件安全分析基础
软件安全分析 (漏洞分析):针对目标软件(分析对象)通过(组合)运用逆向工程、抽象与运算、定制特殊输入数据与受控运行等操作,了解目标软件架构、理解其运行机理,发现并确证其脆弱点(漏洞),为进一步利用或缓解其漏洞提供支持。
静态分析
控制流分析
Callee: Recovering Call Graphs for Binaries with Transfer and Contrastive Learning, Wenyu Zhu, … , Chao Zhang, IEEE S&P’23
数据流分析
- 数据流分析(Data Flow Analysis, DFA) 是一种用来获取相关数据沿着程序执行路径流动的信息分析技术。分析对象是程序执行路径上一组变量值的变化。
抽象解释
静态污点分析
符号执行
动态分析
- 白盒、黑盒、灰盒测试
模糊测试
(1)种子:是模糊测试中用于生成异常输入的基础数据或文件。例如文档、图像文件、数据包等。种子的选择对模糊测试的效果至关重要,因为它们是生成畸形输入的基础。有效地选择和修改种子能使模糊测试更有效地探索程序路径,以发现潜在的漏洞。
(2)模糊测试引擎:在大量畸形输入下自动化地执行目标程序,监控目标程序状态,并收集与记录程序在执行过程中的数据(覆盖率等)和异常行为。
(3)变异:按照一定策略,通过对有效的种子进行修改或扭曲,生成新的畸形输入,以触发目标程序中新的代码路径和错误。常见的变异策略有:
- 覆盖率指导的变异:通过变异生成的畸形输入是否能触及新的、未被覆盖的代码区域
- 基于规则的变异:基于特定的规则或模式进行的变异
- 基于遗传算法的变异:模仿生物进化中的自然选择和遗传原理,在一系列的种子中选择“最有成效”的(即引发最多错误的)进行组合和变异。
3 软件安全研究案例
- 感觉这一章没啥值得考的,就不记录了。。
4 安全的软件开发
软件开发与安全
安全的软件开发三大支柱:风险管理、安全接触点、 安全知识;
软件安全开发方法
感觉无考点。
软件供应链安全
感觉无考点。
5 期末复习
完结撒花~
相关文章:

国科大软件安全原理期末复习笔记
1 软件安全总论 1.软件的三大特性:复杂性、互连性、可扩展性; 2.基本概念:缺陷、漏洞、风险 缺陷(bug):软件在设计和实现上的错误;漏洞(vulnerability):漏洞…...

人工智能软件测试2024年主要趋势
人工智能软件测试领域在未来可能面临多个发展趋势,其中一些趋势可能会对测试方法、工具和流程产生深远的影响。以下是塑造人工智能软件测试未来的主要趋势: 自动化和自动学习测试:随着人工智能的发展,测试自动化将变得更加智能和自…...

【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking)…...

常见的反爬虫风控 | 验证码风控
一.前言 在当今信息技术迅速发展的背景下,网站和在线服务面临着日益增长的自动化访问威胁,这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力,还可能导致敏感数据的泄露,甚至被用于不正当竞争和恶意…...
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
文章目录 Kafka表集成引擎配置Kerberos 支持 虚拟列 资料分享参考文章 Kafka表集成引擎 此引擎与Apache Kafka结合使用。 Kafka 特性: 发布或者订阅数据流。容错存储机制。处理流数据。 老版Kafka集成表引擎参数格式: Kafka(kafka_broker_list, kaf…...

JSP-概念
一、引子 很多读者可能听过JSP,并且知道这是一门过时的技术了。在Spring,SpringBoot已经成为主流的今天,笔者为什么还要介绍JSP的相关内容呢?笔者常常提到一个概念:理解一门技术,要理解这个技术为什么产生…...
sqlite插入语句id自增列问题
sqlite给主键id设置AUTOINCREMENT自增在插入数据的时候报错table has x columns but x-1 values were supplied 为什么自增列要显示不提供,sqlite需要提供自增列table ResTools has 7 columns but 6 values were supplied SQL Statement:insert into ResTools values(管理系统w…...

C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码
Aho-Corasick算法简称AC算法,也称为AC自动机(Aho-Corasick)算法,1975年产生于贝尔实验室(The Bell Labs),是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果: AC算法以模式树…...

【网络取证篇】Windows终端无法使用ping命令解决方法
【网络取证篇】Windows终端无法使用ping命令解决方法 以Ping命令为例,最近遇到ping命令无法使用的情况,很多情况都是操作系统"环境变量"被改变或没有正确配置导致—【蘇小沐】 目录 1、实验环境(一)无法ping命令 &a…...

electron+vue网页直接播放RTSP视频流?
目前大部分摄像头都支持RTSP协议,但是在浏览器限制,最新版的浏览器都不能直接播放RTSP协议,Electron 桌面应用是基于 Chromium 内核的,所以也不能直接播放RTSP,但是我们又有这个需求怎么办呢? 市场上的方案…...
【Delphi 基础知识 19】Assigned的用法
在Delphi中,Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存,以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例: 检查对象是否已分配内存: varMyObject…...
多线程在编程中的重要性有什么?并以LabVIEW为例进行说明
多线程在编程中的重要性体现在以下几个方面: 并行处理: 多线程允许程序同时执行多个任务,这在现代多核心处理器上尤其重要。通过并行处理,可以显著提高程序的执行效率和响应速度。 资源利用最大化: 通过多线程&#x…...
K8S---kubectl top
一、简介 该命令类似于linux–top命令,用于显示node和pod的CPU和内存使用情况 二、命令行 1、help命令 k top --help Display resource (CPU/memory) usage. The top command allows you to see the resource consumption for nodes or pods. This command requires Metri…...
Linux部署前后端项目
部署SpringBoot项目 创建SpringBoot项目 先确保有一个可以运行的springboot项目,这里就记录创建项目的流程了,可以自行百度。 命令行启动 2.1、在linux中,我是在data目录下新创建的一个project目录(此目录创建位置不限制&…...

一文搞懂系列——Linux C线程池技术
背景 最近在走读诊断项目代码时,发现其用到了线程池技术,感觉耳目一新。以前基本只是听过线程池,但是并没有实际应用。对它有一丝的好奇,于是趁这个机会深入了解一下线程池的实现原理。 线程池的优点 线程池出现的背景…...

stable diffusion代码学习笔记
前言:本文没有太多公式推理,只有一些简单的公式,以及公式和代码的对应关系。本文仅做个人学习笔记,如有理解错误的地方,请指出。 本文包含stable diffusion入门文献和不同版本的代码。 文献资源 本文学习的代码&…...

腾讯云服务器怎么买?两种购买方式更省钱
腾讯云服务器购买流程很简单,有两种购买方式,直接在官方活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动…...
基于SpringBoot自定义控制是否需要开启定时功能
在基于SpringBoot的开发过程中,有时候会在应用中使用定时任务,然后服务器上启动定时任务,本地就不需要开启定时任务,使用一个参数进行控制,通过查资料得知非常简单。 参数配置 在application-dev.yml中加入如下配置 …...

“确定要在不复制其属性的情况下复制此文件?”解决方案(将U盘格式由FAT格式转换为NTFS格式)
文章目录 1.问题描述2.问题分析3.问题解决3.1 方法一3.2 方法二3.3 方法三 1.问题描述 从电脑上复制文件到U盘里会出现“确定要在不复制其属性的情况下复制此文件?”提示。 2.问题分析 如果这个文件在NTFS分区上,且存在特殊的安全属性。那么把它从NT…...

视频监控系统EasyCVR如何通过调用API接口查询和下载设备录像?
智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构,支持高清视频的接入和传输、分发,平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...