开源之夏-7(ext)

这份笔记关注几个工具的学习。因为目前必须要用,急需掌握。

笔记链接列表:

  • [make/cmake]
  • [build.info]
  • [LoadLibrary/dlopen]
  • [DSO]

难点是,OpenSSL家族的项目作为历史悠久的库,有很多自研老工具的使用,资料不多。

  • 构建系统:使用perl脚本,使用build.info。将GmSSL子项目迁移,需要掌握Cmake
    (Cmake等工具还未出现的时候,perl脚本用于构建项目,生成Makefile)
  • 动态加载库DSO:OpenSSL(以及 Apache、NGINX 等)自己包的一层跨平台“动态库加载”小框架,本质等价于 Unix 的 dlopen/dlsym + Windows 的 LoadLibrary/GetProcAddress,只是为了可移植性和内部统一接口而造出来的“轮子”。
    (早期 Windows 没有 dlopen,VMS 用另外一套 | 统一抽象后,老代码零改动 )

OpenSSL DSO 在“加载前/后”多做了一轮路径、权限、符号白名单的过滤,而系统原生 API(dlopen/LoadLibrary)默认几乎不做任何安全检查,这就是两者在安全性上的核心差异。


  1. 系统原生 API 的“裸奔”风险
    项目Unix dlopenWindows LoadLibrary
    搜索路径默认按 LD_LIBRARY_PATHDT_RPATH、当前目录……极易被劫持按当前目录、PATH、注册表 App Path,DLL 劫持经典攻击面
    文件校验不做任何哈希/签名验证不做
    符号限制可以加载任意符号,甚至同名符号覆盖(ELF symbol interposition)可以加载任意导出函数
    权限检查只依赖文件系统权限只依赖文件系统权限

  1. OpenSSL DSO 额外做的安全加固
    加固点说明效果
    受控搜索路径DSO_load 默认不搜索当前目录,优先 OPENSSL_DIR 或显式目录;也可传入回调过滤减少“同名库文件”被植入的风险
    文件名白名单只允许加载 sdfpkcs11legacy 等约定好的名字(取决于上层 engine/provider 配置)防止随意加载恶意 .so
    符号前缀/白名单部分 engine 在 DSO_bind_func 前先做 strncmp(symbol, "SDF_", 4) 等过滤防止同名符号污染
    只读映射内部使用 `RTLD_NOWRTLD_LOCAL(Unix)或 LOAD_LIBRARY_SEARCH_SYSTEM32`(Win)
    ENGINE/Provider 配置支持在配置文件中关闭动态加载,或显式指定“仅允许静态链接彻底关闭动态加载攻击面

  1. 总结
  • 系统 API:只管“把文件映射进来”,安全完全交给操作系统。
  • OpenSSL DSO:在“映射进来”前后再加一层“白名单 + 路径限制”,相当于给 dlopen 套了条安全带。

开源之夏-7(ext)
https://43.242.201.154/2025/08/18/开源之夏-7/
Author
Dong
Posted on
August 18, 2025
Licensed under