# IT Sicherheit 笔记

# Netzwerksicherheit

# 保护数据传输

问题

  • 有不同的协议 WLAN(无线局域网)、BT(蓝牙)、5G、以太网、IP/TCP 协议
  • 不同的安全保障层次

应用层:例如单独的即时消息、单独的电子邮件

传输层:例如 TCP 连接、TLS(传输层安全)加密的数据传输

# 分析端点的数据流量

  • 防火墙:过滤进出网络的数据包
  • 入侵检测系统:检测可能的攻击痕迹(攻击者的 “脚印”)

# 传输层的安全

保护目标:

  • Authentifikation: 每一个设备 / 用户的身份认证
  • Vertraulichkeit: 每次连接的数据加密
  • Integrität: 数据包的完整性

问题:密钥交换

使用的方法:AES-128 GCM(高级加密标准)、SHA256(安全哈希算法 256 位)、X509 证书

静态预设的方法或动态 “协商”(即在通信过程中协商选择加密方法)

# TLS 1.3

通过 HTTPS 保障 HTTP 安全,通过 SMTP over TLS 保证 SMTP 安全

  • 加密算法:规定了 5 种密码套件(Cipher Suites), 只允许 AEAD 模式的密码
  • 密钥交换:用 ECDH 密钥交换
  • 身份验证:CR, X.509
  • 数字签名:RSA 或者 ECDSA

# TLS-Protokollablauf

目标:Clint A 安全地连接 Server B

  • 初始化:Handshake-Protokoll:

    • 确定 Cipher-Suite
    • 身份认证
    • 去中心化生成共享密钥:ka,b,kb,ak_{a,b},k_{b,a} , 并且生成一个用于握手消息的 MAC 密钥kmac)来确保消息的完整性和认证
  • 加密数据交换:Application Data Protokoll

    • 客户端和服务器之间传输的应用数据包(如 HTTP 请求、邮件内容等)会进行端到端加密

# TLS-Handshake-Protokoll

广为流传的版本:Server B 对 A 验证自己,A 不对 Server B 验证自己

# Msg1: A to B

  • A 随机生成 RAR_A
  • A 生成 DH-Paar (DH-eA,DH-dA)(DH\text{-}e_A, DH\text{-}d_A)
  • 选择 Cipher-Suite csAcs_A

生成第一个消息 m1=ClientHello,ID,RA,DH-eA,csAm1 = \text{ClientHello,ID,}R_A,DH\text{-}e_A,cs_A

# Msg 2: B 生成,不发送

  • B 生成 RBR_B, 选择 csAcs_A 作为 Cipher-Suite, (let cs=csAcs=cs_A)
  • 生成 (DH-eB,DH-dB)(DH\text{-}e_B, DH\text{-}d_B)

第二个消息 m2=RB,cs,ID,DH-eB,cert(eB)m2 = R_B,cs,ID,DH\text{-}e_B, cert(e_B)

  • 通过 DH-eADH\text{-}e_ADH-dBDH\text{-}d_B 生成 DH-Secret ss
  • 通过 KDF(sRARB)KDF(s||R_A||R_B) 生成密钥 ka,b,kb,a,kmack_{a,b},k_{b,a},k_{mac}
  • 计算 sig=SigdB(H(m1m2))sig=Sig_{dB}(H(m1||m2))
  • 计算 c=Ekb,a(ApplicationData)c=E_{k_{b,a}}(ApplicationData)

# Msg 3: B to A

Finish=Ekb,a(HMACkmac(m1m2sig)Finish=E_{k_{b,a}}(HMAC_{k_{mac}}(m1||m2||sig)

m3=ServerHello,m2,sig,Finishm3 = \text{ServerHello},m2,sig,Finish

# HTTP Request: A to B

  • 验证签名 VerifyeB(SigdB(H(m1m2)))==H(m1m2)Verify_{e_B}(Sig_{dB}(H(m1||m2))) == H(m1||m2)
  • m2m2 提取 DH-eBDH\text{-}e_BDH-eADH\text{-}e_A 计算 ss
  • 通过 KDF(sRARB)KDF(s||R_A||R_B) 生成密钥 ka,b,kb,a,kmack_{a,b},k_{b,a},k_{mac}
  • 验证 HMAC: HMACkmac(m1m2sig)==Dkb,a(Finish)HMAC_{k_{mac}}(m1||m2||sig) == D_{k_{b,a}}(Finish)
  • 生成结束 Finish=Eka,b(HMACkmac(m1m3))Finish=E_{k_{a,b}}(HMAC_{k_{mac}}(m1||m3))

发送 Finish,Finish, HTTP Request

A 之后用 ka,bk_{a,b} 加密数据

# B 验证 Finish

B 验证 Finish==Eka,b(HMACkmac(m1m3))Finish == E_{k_{a,b}}(HMAC_{k_{mac}}(m1||m3))

B 之后用 kb,ak_{b,a} 加密数据

# TLS 1.3-Handshakes 的种类

之前说的是 1-RTT (Round Trip Time)

# 双方方互相验证的 TLS1.3

  • B 发送 ServerHello 的时候同时发送一个 Certificate Request
  • A 会回复它的 Client-Certificate cert(eA)cert(e_A) , 并且签名 cert(eA),DdA(H(m1m2))cert(e_A),D_{dA}(H(m1||m2))
  • B 再验证这个签名

# 0-RTT

A 保存之前的 ka,bk_{a,b} 并且用作之后的通讯

A 在发送 Hello 之后,直接发送数据

# ACME

Automatic Certificate Management Environment (ACME)

问题:

Server 经常没有 TLS 服务,生成 TLS-Server-Zertifikats 太贵了

ACME-Protocoll 可以通过自动化流程为网站服务器颁发免费的 TLS 证书。

Let’s Encrypt:广泛使用的认证机构(CA),为网站提供免费 TLS 证书

# 应用对象的安全保障

Messenger 即时信息服务

WhatsApp, Signal, Telegram, Threema, Matrix

安全目标:

  • Vertraulichkeit 机密性:在数据传输过程中保证安全

加密通信模式

  • E2E 加密 + TLS 传输:服务器不能读取消息
  • 仅传输层层加密:服务器可以读取消息

# 案例:Singal

隐私保护和安全通信为核心设计,开源软件,由非盈利组织 Signal Foundation 维护和运营。

用户注册:

  • 需要电话号码
  • 电话号码只存 hash 值
  • Signal-Server 不存储用户数据

通信安全:

  • AES-256 加密,通过用户 PIN 保护
  • TLS 加密传输
  • 不保存元数据 Metadata

# Signal Protokoll

Signal 协议被广泛用于 Whatsapp 等平台

任务:

  • 双向身份验证
  • 支持离线模式
  • 每条信息用新的密钥加密
  • 音视频传输

协议实现:

  • X3DH (Extended Triple Diffie-Hellman)主要用于初始密钥协商,在通信开始时确定共享密钥
  • Double Ratchet 用于即时消息的加密,动态更新加密密钥,确保消息安全。

# Double Ratchet-Protokoll

# Symmetrisches Ratchet Protokoll

基础是: A,B 直接共享密钥 CK

任务:

  • AiA_i 作为第 ii 个消息的密钥
  • A,B 去中心化计算密钥
  • 对称加密

过程:

  • A 计算 (CKneu,Ai)=KDF(0x01,CK)(CK_{neu}, A_i) = KDF(\text{0x01},CK)
  • B 用自己的 CK 计算 AiA_i
  • 下一个用 CKneuCK_{neu} 作为基础

image-20250210221913557

# DH-Ratchet-Protokoll

之前这个的问题是,没有 PFS,所以需要 DH-Ratchet

第一步:A

  • A 生成新的 (eAneu,dAneu)(e_{A_{neu}},d_{A_{neu}}) DH pair
  • A 计算 DH-s=DH(dBneu,eB)DH\text{-}s=DH(d_{B_{neu}}, e_B) 作为新的 CK

第二步:B

  • B 收到 eAneue_{A_{neu}} , 计算 DH-s=DH(dB,eAneu)DH\text{-}s=DH(d_B, e_{A_{neu}})
  • B 生成新的 (eBneu,dBneu)(e_{B_{neu}},d_{B_{neu}}) , 使用新的进行下一轮

image-20250210224938728

# 例子说明

首先,设 B 当前的 DH 密钥是 (eB0,dB0)(e_B^0, d_B^0)

# A 给 B 发消息

A 先生成 (eA1,dA1)(e_A^1, d_A^1) , 然后用 B 当前的公钥得到

DH1=ECDH(dA1,eB0)DH^1 = ECDH(d_A^1, e_B^0) , 用这个作为 KDF 左侧的输入,和上一个 RK 导出新的 RK. 我们设上一个 RK 是 RK0RK^0 (初始情况的 RK = SK, SK 是从 X3DH-Protokoll 交换出来的), 这里就求了 RK1=KDF(DH1,RK0)RK^1= KDF(DH^1, RK^0)

然后用这个 RK1RK^1 作为 Symmetrisches Ratchet Protokoll 的 CK , 推导出发送消息的 Message Key A1A_1 , 如果发送多条消息要重复推导,也就是 A2=KDF(constant,CKlast)A_2 = KDF(constant, CK_{last}) 用上一个 CK 推到下一个 CK 和 Message Key。

此时 B 是离线状态

# B 给 A 发消息

此时 B 上线了,首先计算 DH1=ECDH(dB0,eA1)DH^1 = ECDH(d_B^0, e_A^1) , 用这个推导出 A 的 Message Key 来解密所有的消息 (过程和 A 一样)。

然后 B 给 A 发消息:

首先生成 (eB1,dB1)(e_B^1, d_B^1) , 计算 DH2=ECDH(dB1,eA1)DH^2=ECDH(d_B^1,e_A^1) , 推导 RK2=KDF(DH2,RK1)RK^2=KDF(DH^2,RK^1), 然后用这个 RK2RK^2 作为新的 CK 推导出自己发送消息的 Message Key

以此类推

# Signal-Protokoll 的安全机制

  • PFS
  • Backward Secrecy: 一条信息的密钥泄露不会影响之前的安全性
  • 通过 X3DH 协议双向认证
  • 群聊: E2E 加密

# Systemsicherheit

# 操作系统的任务

  • 通过 syscall 控制硬件
  • 控制:内存,CPU, E/A, 文件管理
  • Modi: Kernal-Mode: 执行特权命令;User-Mode: 执行普通命令

# 操作系统的保护 / 控制任务

  • 标识符 Identifikatoren: 进程,文件,文件的安全管理

  • 访问控制

  • 访问与信息流控制: ACL (访问控制列表), 权限能力,分类

  • 安全启动:Secure Boot, Trusted Boot

  • 安全运行环境: TEE

  • RAM 保护机制: Canaries, DEP 数据执行保护,ASLR 地址空间布局随机化

  • 虚拟化: Isolation, Hypervisor, VM-Monitor

# 内存保护

冯诺依曼架构 universelle Interpretierbarkeit:程序指令和数据存储在同一存储器中,具有统一的地址空间。

# 进程地址空间

image-20250210170538424

# Buffer Overflow

# Example 1

p
void a() {
	bool is_admin;
    char msg[128];
    gets(msg);
}

这个时候, is_admin 在 msg 的上面,Buffer Overflow 的时候是从低地址往高地址 overflow,可以覆盖掉 is_admin

image-20250210171343432

# Return To ShellCode

可以把 shellcode (可以打开 shell 的代码) 作为输入,然后控制返回地址,跳转到这个 shellcode 的地方开始执行。

# Stack-Shielding

# Stack Canary

在返回地址前面加一个随机数,如果随机数被覆盖了就说明有 Buffer Overflow

这个保护措施通过 GCC 加的

image-20250210171726661Shadow Stack

Shadow-Stack 是一个独立且受保护的内存区域,用于安全存储函数调用的返回地址。它与常规栈相分离,以防止攻击者通过缓冲区溢出等手段篡改返回地址。

# DEP

Data Execution Prevention:

  • CPU-Feature NX-bit (No-eXecute) 标记为不可运行

# ASLR

Address Space Layout Randomization 地址随机化

因为 DEP 不能保护 Return Oriented Programming (ROP)

  • Linux 在每个程序启动的时候随机化
  • Windows 在每次启动系统的时候随机化

但是代码段不会随机化

扩展:

  • PIE (Position Independent Executable): 支持代码段随机化
  • KASLR: Kernel ASLR 对内核地址空间进行随机化,从而进一步提升内核态安全性。

# Virtual-Machine-Monitor (VMM)

目标:

  • 将物理硬件资源抽象为虚拟化资源,供虚拟机使用.
  • Isolation: 确保各虚拟机(VM)之间相互独立,不受干扰

VMM/Hypervisor:

  • 是一种管理虚拟机的软件,负责创建、启动和运行虚拟机。
  • 允许不同的操作系统在多个虚拟机中并行运行。
  • Hypervisor 实现了虚拟机之间的隔离,防止一个虚拟机对另一个虚拟机的直接干扰或访问。
  • Hypervisor 可以控制虚拟机的状态,包括暂停、重启、调整资源配置等。

# Container-Konzept

轻量化的虚拟化,以更高效地运行和管理应用程序。

容器将应用程序运行所需的所有组件打包成一个整体,包括:应用程序代码,相关服务,依赖的库与运行环境

  • 容器在用户空间中以 隔离进程 的方式运行。
  • 与传统虚拟机相比,容器的隔离性较弱,因为它们共享相同的内核。

优点是:轻量高效,易于部署和维护

# 硬盘加密

保护系统中数据的机密性,特别是当攻击者拥有物理访问权限时。

例如,一台包含公司敏感数据的笔记本电脑被盗,攻击者拆下硬盘后,操作系统的保护措施不再生效,数据可能被轻易访问。

通过加密保护数据,只有在用户提供正确的密码(Passphrase)后,才能解密数据并访问。

在计算机关闭时,数据处于加密状态,无法被访问或读取。

# 种类

  • 通过特定应用程序对文件进行加密,例如 PDF 文件加密。
  • 文件系统层面进行加密,比如 fscrypt(Linux)
  • Device Mapper: 在硬盘和文件系统之间进行透明加密,例如 BitLocker(Windows)、dm-crypt/LUKS(Linux)

# 硬盘加密的局限性

  • 在加密过程中,密钥需要始终存储在主存(RAM)中,以便操作系统和应用程序访问。这意味着在系统运行时,密钥始终暴露于内存中。
  • Cold Boot Attacks: 即使设备关闭,DRAM(动态随机存取内存)芯片仍会在短时间内保持其数据状态。
  • 硬盘加密无法防止恶意软件的入侵 (恶意软件可以在系统运行时监视并记录密码输入或直接访问密钥)

解决方案

  • 将加密密钥存储在 CPU 的寄存器中
  • AMD SME,Intel MKTME 技术可以在硬件级别进行加密操作
  • 使用受信执行环境,如 Intel SGXAMD SEV 为加密操作提供一个安全的运行环境

# 信息安全管理

信息安全管理(ISM)是组织内部制定的一系列程序和规则,旨在确保信息安全的有效管理,包括

  • 控制与管理:对信息安全进行持续的控制和监督,以确保其有效性。
  • 保持与改进:确保信息安全的管理措施能够长期有效运行,并通过持续的优化和改进保持高效性。