我正在尝试针对控制流技术设置 CI 测试,以确保我们的内联 ASM 与影子堆栈一起按预期运行。该功能称为控制流执行技术 (CET)在 Intel 处理器上,GCC 提供了通过以下方式启用它的选项-fcf-protection=full
,-mcet
和朋友。
我使用 Fedora 26/GCC 7.2 在第 7 代 Core i5 上进行了快速测试。结果失败了,这并不奇怪:
$ CXXFLAGS="-DNDEBUG -g2 -O3 -fcf-protection=full -mcet" make
g++: error: unrecognized command line option ‘-fcf-protection=full’; did you mean ‘-fstack-protector-all’?
g++: error: unrecognized command line option ‘-mcet’; did you mean ‘-maes’?
make: *** [GNUmakefile:1057: cryptlib.o] Error 1
我参观过/proc/cpuinfo 中的标志是什么意思?在Unix 和 Linux Stack Exchange我没有看到cet
旗帜ibt
。
我的第一个问题是,哪些英特尔处理器支持 CET?
我的第二个问题是,CET 需要内核支持吗?如果需要,哪些 Linux 内核支持它?
答案1
我的第一个问题是,哪些英特尔处理器支持 CET?
截至 2017 年 10 月 20 日,目前尚未出售支持该功能的英特尔处理器。
英特尔尚未正式评论何时会在新 CPU 中采用 CET 来保护控制流完整性,但考虑到 GCC 工作的时机,希望我们能够在 Cannonlake 或最坏的情况下在 Ice lake 中看到它。
我使用 Fedora 26/GCC 7.2 在第 7 代 Core i5 上进行了快速测试。结果失败了,这并不奇怪:
您需要使用支持此功能的 GCC 版本才能在程序中使用它。这意味着一旦发布,您将需要使用 GCC 8.1。不太可能需要内核支持,但考虑到目前市场上没有处理器支持,几乎不可能预测具体要求是什么。
但是,我看不出有任何迹象表明需要内核支持,因为 GCC 使用的这些指令与平台无关。如果内核将来添加使用这些指令的功能到其 API,我不会感到惊讶。