Skip to content

Conversation

@wangrong1069
Copy link
Contributor

As title

Log: Update compiler flags for security enhancements
Bug: https://pms.uniontech.com/bug-view-342665.html

As title

Log: Update compiler flags for security enhancements
Bug: https://pms.uniontech.com/bug-view-342665.html
@deepin-ci-robot
Copy link

deepin pr auto review

这份代码修改主要针对编译构建系统(CMake 和 qmake)进行了安全加固(Hardening)的配置。以下是对这两处修改的详细审查意见,包括语法逻辑、代码质量、代码性能和代码安全方面的分析。

1. CMakeLists.txt 修改审查

修改内容概述:
Release 模式下,增加了一系列编译和链接选项以增强安全性,包括栈保护、格式化字符串检查、RELRO(重定位只读)等。

1.1 语法逻辑

  • 正确性:语法符合 CMake 规范。if(CMAKE_BUILD_TYPE STREQUAL "Release") 判断逻辑正确,变量设置方式也是标准的。
  • 构建类型判断:使用了 STREQUAL 进行字符串比较。建议考虑使用 CMAKE_BUILD_TYPE 的多配置生成器(如 Visual Studio)兼容性,但在 Linux/Unix 环境下通常没有问题。

1.2 代码质量

  • 消息输出message("Enable build hardening.") 是好的实践,能让构建者知道当前开启了安全特性。
  • 冗余设置set(CMAKE_VERBOSE_MAKEFILE ON) 会输出详细的编译命令。虽然这对调试有用,但将其与"安全加固"逻辑绑定在一起略显耦合,建议视项目需求决定是否保留,或者将其移到更外层的配置中。
  • 拼写错误风险:注意检查 HARDENING_FLAGS 中的路径变量 ${CMAKE_SOURCE_DIR} 是否被正确解析,特别是在路径包含空格的情况下(虽然 ffile-prefix-map 通常处理路径,但需注意引号处理)。

1.3 代码性能

  • 优化级别:标志中包含了 -O2。这会启用通用的优化,是 Release 版本的合理选择。
  • 调试信息:包含了 -g。这会生成调试信息,略微增加二进制文件体积,但在 Release 版本中保留调试符号对于崩溃分析(coredump 分析)是非常有价值的,权衡利弊后这是一个好的做法。

1.4 代码安全

  • 栈保护-fstack-protector-strong 是比默认更强的栈保护,能有效缓解栈溢出攻击。
  • 源码加固-D_FORTIFY_SOURCE=2 启用了 glibc 的缓冲区溢出检查,比版本 1 更严格。
  • 栈冲突保护-fstack-clash-protection 能够防止栈跳过攻击,增加了一层防护。
  • 格式化字符串-Wformat -Werror=format-security 强制检查格式化字符串漏洞,并将其视为错误,这是非常必要的安全措施。
  • 重定位保护:链接器参数 -Wl,-z,relro -Wl,-z,now 启用了完全 RELRO,延迟绑定的攻击面被最小化(GOT 表不可写)。
  • 文件映射-ffile-prefix-map=... 用于去除构建路径信息,有助于构建二进制 reproducibility(可重现构建),防止路径泄露。

改进建议:

  1. 增加 ASLR/PIE 支持:虽然 reader.pro 中增加了 -pie,但在 CMakeLists.txtHARDENING_FLAGS 中没有看到显式的 -fPIE(编译)和 -pie(链接)。
    • 建议在 CMAKE_C_FLAGSCMAKE_CXX_FLAGS 中添加 -fPIE,并在 CMAKE_EXE_LINKER_FLAGS 中添加 -pie,以支持地址空间布局随机化(ASLR)。
  2. 考虑 -fno-common:GCC 10 默认开启了 -fno-common,这有助于防止跨翻译单元的全局变量符号冲突导致的潜在 Bug。如果编译器版本较旧,建议显式添加。

2. reader/reader.pro 修改审查

修改内容概述:
在 qmake 工程文件中,更新了 C/C++ 编译标志和链接标志,修正了宏定义的拼写,并增加了链接时的安全选项。

2.1 语法逻辑

  • 拼写修正:将 -D_FORTITY_SOURCE=1 修正为 -D_FORTIFY_SOURCE=2。这是一个非常重要的 Bug 修复,因为之前的拼写错误导致该宏未生效,且即使生效级别也较低。
  • 参数位置:将 -O2 添加到 QMAKE_CFLAGSQMAKE_CXXFLAGS 中是合理的,确保优化级别被显式指定。

2.2 代码质量

  • 冗余参数
    • 代码中同时存在 -fPIC(生成位置无关代码,用于共享库)和 -fPIE(生成位置无关可执行文件)。
    • 对于可执行文件,-fPIE 是必须的。-fPIC 通常用于编译动态库。虽然混用通常不会报错,但建议明确区分。如果是构建可执行文件,-fPIE 足够;如果是构建插件或库,则用 -fPIC
  • 链接器标志-z noexecstack-z lazy(注意:lazy 是默认行为,而 now 是安全行为)被混用。
    • 在修改后的代码中,链接标志增加了 -Wl,-z,relro -Wl,-z,now。这与 CMakeLists.txt 的修改保持一致,是正确的。
    • 注意-z lazy 仍然保留在 QMAKE_CFLAGS 中。虽然编译器可能会忽略不属于它的标志,但 -z 是链接器标志(ld),不应该出现在 QMAKE_CFLAGS 中。这属于语法不规范,虽然 qmake 可能会宽容处理,但最好清理。

2.3 代码性能

  • 优化级别:显式添加 -O2 确保了性能优化。

2.4 代码安全

  • 宏修正:如前所述,_FORTIFY_SOURCE 从 1 升级到 2,显著提高了安全性。
  • 链接安全:增加了 -Wl,-z,relro -Wl,-z,now,实现了完全 RELRO,防止 GOT 表覆写攻击。
  • NX Bit-z noexecstack 确保栈不可执行,防止 shellcode 注入。
  • PIE-pie 配合编译时的 -fPIE(虽然 diff 中未显式添加到 CFLAGS,但代码中有 QMAKE_CXXFLAGS += -fPIE)确保了 ASLR 的有效运作。

改进建议:

  1. 清理无效/错位的标志
    • 移除 QMAKE_CFLAGSQMAKE_CXXFLAGS 中的 -z noexecstack-z lazy。这些是链接器参数,应放在 QMAKE_LFLAGS 中。
    • QMAKE_LFLAGS 中已经包含了 -pie,建议检查是否需要显式添加 -z noexecstackQMAKE_LFLAGS(目前 diff 中未体现,但 CFLAGS 中有)。
    • -z noexecstack 移至 QMAKE_LFLAGS += -Wl,-z,noexecstack
  2. 移除 -z lazy:既然已经添加了 -Wl,-z,now(立即绑定),就不应该保留 -z lazy(延迟绑定)。now 是更安全的选择,保留 lazy 可能会导致冲突或后者失效(取决于解析顺序,通常后者覆盖前者,但显式移除更清晰)。

3. 综合总结与建议

这份 diff 的主要目的是引入编译时和链接时的安全加固选项,整体方向非常正确且必要。

主要优点:

  1. 统一了 CMake 和 qmake 的安全配置。
  2. 修复了 _FORTIFY_SOURCE 的拼写错误并提升至级别 2。
  3. 引入了栈保护、格式化字符串检查、RELRO 等关键安全特性。

需要改进的点:

  1. CMakeLists.txt:建议补充 -fPIE-pie 以确保 ASLR 完整开启。
  2. reader.pro:存在标志分类混乱的问题,将链接器标志(如 -z 开头的选项)放在了编译器变量(QMAKE_CFLAGS)中。建议将这些移至 QMAKE_LFLAGS
  3. 一致性:确保 CMakeLists.txtreader.pro 中的安全选项尽可能一致,避免不同构建系统产出的二进制安全强度不一致。

推荐的 CMakeLists.txt 片段优化:

if(CMAKE_BUILD_TYPE STREQUAL "Release")
    message(STATUS "Enable build hardening.")

    # set(CMAKE_VERBOSE_MAKEFILE ON) # 建议根据需要单独开启

    set(HARDENING_FLAGS "-Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -ffile-prefix-map=${CMAKE_SOURCE_DIR}=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fPIE")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${HARDENING_FLAGS}")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${HARDENING_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now -pie")
endif()

推荐的 reader.pro 片段优化:

# 安全编译参数 - 仅保留编译器相关的
QMAKE_CFLAGS += -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIC -fPIE -O2
QMAKE_CXXFLAGS += -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIC -fPIE -O2

# 安全链接参数 - 将所有 -z 参数移至此处
QMAKE_LFLAGS += -pie -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lzwind, wangrong1069

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@wangrong1069
Copy link
Contributor Author

/merge

@deepin-bot deepin-bot bot merged commit f71fed7 into linuxdeepin:master Feb 2, 2026
6 checks passed
@wangrong1069 wangrong1069 deleted the pr0131 branch February 2, 2026 02:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants