Linux 上进程 Capabilities 可能变化的场景

0、前言 本文不介绍各个 Cap 集的含义,只列举它们各自发生变化的场景和方式。 只讨论 Linux 2.6.33 之后的场景,即:1、Bounding Set 为 per-thread 属性;2、支持文件 Cap。 1、线程自行调整 相较于 DAC 和 MAC,Capabilities 的一个特点是可在运行时动态增减。程序的代码中可带有调整 Cap 的相关系统调用和逻辑,在执行时根据需要主动调整线程的 Cap。例如,在执行某些需要特权的操作前将(Permitted Set 范围内)必要的 Cap 添加至 Effective Set 中,在执行完毕后再将这些 Cap 从 Effective Set 中去除。这种会主动调整 Cap 的 …

Stack Canary 的应用

Canary 一词意为金丝雀,相传以前矿工们会携之下矿井,一旦金丝雀死亡则说明矿井中存在瓦斯泄露的情况。而 Stack Canary 的作用也类似:每开辟一个新栈帧时,先在毗邻上一栈帧处设置一个特定值,然后在每次函数返回时检查一下该值是否被改变;如被改变,则说明栈被越界写所破坏。 用户态程序 上面提到的关于 Canary 值的设置、校验,以及出错后的处理,这些动作的代码逻辑都是由编译器负责生成并嵌入到可执行文件中的。用户需要做,或者说可以做的事情只有: 需要添加 -fstack-protector/-fstack-protector-strong 编译参数。 可以在代码中定义 __stack_chk_guard 全局变量, …

ARMv8 PAN 特性及其与 XOM 的冲突

前言 NetBSD 的 mmap(2) 手册 讲解 prot 入参的部分提到: Note that, due to hardware limitations, on some platforms PROT_WRITE may imply PROT_READ, and PROT_READ may imply PROT_EXEC. Portable programs should not rely on these flags being separately enforceable. 我们熟知的“权限分为 rwx,各用一个 bit 表示”只是一种理想的模型,实际硬件上不一定是这么实现的。 问题背景 ARMv8.1 …

ARM64 PAC 相关场景与代码流程

代码所在地 功能代码 arch/arm64/kernel/pointer_auth.c arch/arm64/include/asm/pointer_auth.h arch/arm64/include/asm/asm_pointer_auth.h(这个容易漏掉!) 测试代码 tools/testing/selftests/arm64/pauth/*,用户态测试 TEST(corrupt_pac):测试篡改带 PAC 的 LR 是否会导致验签失败从而令用户态进程收到信号 TEST(pac_instructions_not_nop{,_generic}):测试 pac* …

SELinux:系统启动时通过用户态配置动态关闭的流程

要在系统启动时彻底关闭 SELinux(即设为 Disabled 状态),已知有几种办法: 内核启动参数 selinux=0 配置 /etc/selinux/config 关于 /etc/selinux/config,我们知道可以通过它来对 SELinux 进行初始设置,包括运行状态以及要加载的策略文件。那么,这是怎么做到的呢?又是谁实际执行了这些操作?在开闭 SELinux 上,通过它与通过内核启动参数有何不同? 首先,内核对该文件完全是不感知的:查遍 security/selinux 下的所有代码,都没有关于该文件的内容。随后在 Fedora 的 Wiki 上查到: When booting up the machine, …