【发布时间】:2020-05-14 00:44:43
【问题描述】:
在我们基于 GCC 的 C 嵌入式系统中,我们使用 -ffunction-sections 和 -fdata-sections 选项来允许链接器在链接最终可执行文件时删除未使用(未引用)的部分。这多年来一直很好。
在同一个系统中,大多数数据结构和缓冲区都是静态分配的(通常在文件范围内作为static-variables)。
当然,我们有错误,有时是令人讨厌的错误,我们希望快速排除缓冲区溢出的可能性。
我们的一个想法是在每个 bss-section 和 data-section 之间放置金丝雀——每个都只呈现一个符号(因为-fdata-sections)。就像编译器在激活 Stack-Smashing 和 StackProtection 时对函数堆栈所做的那样。可以通过“不时”读取金丝雀地址来从主机检查这些金丝雀。
似乎修改链接器脚本(手动放置该部分并在其间添加一个金丝雀字)似乎是可行的,但这有意义吗?
在野外有项目或文章吗?使用我的关键字我找不到任何东西。
【问题讨论】:
-
好吧,您可能知道这并不能取代安全编程和代码审计,但在某些情况下,它当然可能有助于检测缓冲区溢出并防止漏洞或行为不端的系统。当然,在短时间内检查金丝雀是必要的,并且可能会给系统(尤其是低容量的嵌入式系统)带来不必要的负载或延迟。
-
安全的编程和代码审计以及编码标准并不能防止错误。至少不是在 C 中,这就是我们的想法。
-
当然它们可以防止错误。它们是否能防止所有个错误取决于这些操作的执行程度以及代码的复杂程度。
-
“安全的编程和代码审计以及编码标准并不能防止错误” 那你就做错了。加强组织进行同行评审,采用像 MISRA-C 这样的合理编码标准,然后使用静态分析工具添加检查都是提高代码质量的非常有效的方法。以牺牲上市时间为代价,因为虽然它们很有效,但这些东西往往会消耗大量的时间和耐心。
-
我应该说“不要阻止所有的错误”。
标签: c gcc linker embedded bare-metal