From 3c1af62b59fb08ce70b5da66bfbd49b036f0ff98 Mon Sep 17 00:00:00 2001 From: xujian Date: Fri, 30 Dec 2022 02:48:53 +0000 Subject: [PATCH] =?UTF-8?q?update=20=E5=AE=89=E5=85=A8=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E8=8C=83/openKylin-C&C++=E8=AF=AD=E8=A8=80=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E7=BC=96=E8=AF=91=E8=A7=84=E8=8C=83.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xujian --- ...26\350\257\221\350\247\204\350\214\203.md" | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git "a/\345\256\211\345\205\250\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-C&C++\350\257\255\350\250\200\345\256\211\345\205\250\347\274\226\350\257\221\350\247\204\350\214\203.md" "b/\345\256\211\345\205\250\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-C&C++\350\257\255\350\250\200\345\256\211\345\205\250\347\274\226\350\257\221\350\247\204\350\214\203.md" index 0cac527..dea680a 100644 --- "a/\345\256\211\345\205\250\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-C&C++\350\257\255\350\250\200\345\256\211\345\205\250\347\274\226\350\257\221\350\247\204\350\214\203.md" +++ "b/\345\256\211\345\205\250\347\274\226\347\240\201\350\247\204\350\214\203/openKylin-C&C++\350\257\255\350\250\200\345\256\211\345\205\250\347\274\226\350\257\221\350\247\204\350\214\203.md" @@ -79,102 +79,197 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、 5.1. 作用范围 +链接选项,动态库、ELF格式可执行程序 + 5.2. 使用方法 +-Wl,-z,noexecstack + 5.3. 强制性 +必选 + 5.4 说明 +缓冲区溢出成功后都是通过执行shellcode来达到攻击的目的,而shellcode一般都是在缓存区里,只要操作系统限制堆栈中的数据只可读写,不可执行,一旦堆栈中的数据被执行立即报告错误并退出,那么溢出成功后也不能执行shellcode,从而达到对应用安全防护的目的。 + ## 6. 地址无关 6.1. 作用范围 +编译选项,动态库 + 6.2. 使用方法 +–fPIC(-fpic) + + 6.3. 强制性 +必选 + 6.4 说明 +地址无关选项将发生在代码段的重定位移到数据段实现,so文件加载时代码段不会发生任何变化,做到所有进程共用一个代码段副本。 +-fPIC和-fpic均指示GCC产生地址无关代码,唯一的区别是-fPIC产生代码稍大,-fpic产生代码相对较小。 + + ## 7. 随机化 7.1. 作用范围 +编译链接选项,ELF格式可执行程序 + 7.2. 使用方法 +-pie –fPIE(-fpie) + + 7.3. 强制性 +必选 + + 7.4 说明 +具备PIE的可执行文件,在加载执行时可像共享库一样随机加载。有研究表明:PIE可有效降低固定地址类攻击、缓冲溢出类攻击的成功概率。 +(1)关注对应的热补丁版本是否支持PIE选项,不支持的场景下不建议使用该选项 +(2)-fPIE编译选项,-pie链接选项。 +(3)-fPIE产生代码稍大,-fpie产生代码相对较小。 + ## 8. FS 8.1. 作用范围 +编译选项,可重定位文件(.o)、动态库、ELF格式可执行程序 + 8.2. 使用方法 +-D_FORTIFY_SOURCE=2 -O2 + 8.3. 强制性 +可选 + 8.4 说明 +程序中使用到静态的固定大小的缓冲区,增加了该选项之后,编译器或运行时库会对相关函数的调用在编译时或运行时进行检查。 +先在分支版本添加,重点做性能测试,根据测试结果取舍。 + ## 9. 立即绑定 9.1. 作用范围 +链接选项,动态库、ELF格式可执行程序 + 9.2. 使用方法 +-z,now + 9.3. 强制性 +必选 + 9.4 说明 +会使包含动态库的程序启动变量,但会使第一次调用函数速度变快 + ## 10. 动态库符号隐藏 10.1. 作用范围 +链接选项,动态库 + 10.2. 使用方法 +-fvisibility=hidden + + 10.3. 强制性 +可选 + 10.4 说明 +(1)、设置默认的ELF镜像中符号的可见性为隐藏。使用这个特性可以非常充分的提高连接和加载共享库的性能,生成更加优化的代码,提供近乎完美的API输出和防止符号碰撞。在库中减少符号的数目还可以减少库的内存印迹,减少动态连接器的工作量。 +(2)、需要进行代码整改。 + ## 11. 整数溢出检查 11.1. 作用范围 +编译选项,可重定位文件、动态库、ELF格式可执行程序 + 11.2. 使用方法 +-ftrapv + 11.3. 强制性 +可选 + 11.4 说明 +(1)、使用了-ftrapv选项后,执行带符号的整数间的加、减、乘运算时,不是通过CPU的指令,而是用包含在GCC附属库libgcc.c里的函数来实现。 +(2)、性能影响较大,建立在Debug版本中实施,Release版本不实施。 + ## 12. 栈检查 12.1. 作用范围 +编译选项,可重定位文件、动态库、ELF格式可执行程序 + 12.2. 使用方法 +-fstack-check + 12.3. 强制性 +可选 + 12.4 说明 +(1)、stack-check在编译时检查程序中栈空间,如果超过编译告警阀值则产生告警;然后在程序中生成额外的指令来检查运行时栈不会被溢出,stack-check选项会在每个栈空间最低底部设置一个安全的缓冲区,如果函数中申请的栈空间进入安全缓冲区,则触发一个Storage_Error异常。但它所生成的代码实际上并不处理异常,如果检测到异常则会发出一个消息,通知操作系统处理。它只保证操作系统可以检测到栈扩展。 +(2)、性能影响较大,建立在Debug版本中实施,Release版本不实施 + ## 13. 删除符号表 13.1. 作用范围 +链接选项,动态库、ELF格式可执行程序 + 13.2. 使用方法 +-s(strip) + 13.3. 强制性 +可选 + 13.4 说明 +(1)、符号在链接过程中,发挥着至关重要的作用,链接过程的本质就是把多个不同的目标文件“粘”到一起,符号可看作链接的粘合剂,整个链接过程正是基于符号才正确完成的。链接完成后,符号表对可执行文件运行已经无任何作用,反而会成为攻击者构造攻击的工具,因此删除符号表可防御黑客攻击。事实上删除符号表除防攻击外,还可对文件减肥,降低文件大小。 +(2)、会影响产品定位网上问题. + ## 14. 告警选项 14.1. 作用范围 +编译选项,可重定位文件、动态库、ELF格式可执行程序 + 14.2. 使用方法 +-Wformat=2 +-Wfloat-equal +-Wshasow + 14.3. 强制性 +可选 + 14.4 说明 +C++开发的代码,不使用-Wshadow -- Gitee