RT
Hey @hexiaowen, Welcome to openEuler Community.
All of the projects in openEuler Community are maintained by @openeuler-ci-bot.
That means the developpers can comment below every pull request or issue to trigger Bot Commands.
Please follow instructions at https://gitee.com/openeuler/community/blob/master/en/sig-infrastructure/command.md to find the details.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
gcc_securec 是对gcc进行封装替换。
从openEuler-rpm-config中添加,只能覆盖使用autoconf生成makefile的软件。直接使用makefile/gcc命令编译的软件无法正常添加编译选项。
目前没有更好的方案,任务挂起
gcc_securec 是对gcc进行封装替换。
从openEuler-rpm-config中添加,只能覆盖使用autoconf生成makefile的软件。直接使用makefile编译的软件无法正常添加编译选项。
目前没有更好的方案,任务挂起
@hexiaowen 我觉得至少有个 %preun 的部分,能够支持卸载掉这个修改。
然后这个 rpm 的逻辑本身也是有问题,他相当于修改了另外一个包的软件,那在安装 gcc_secure 以后去升级 gcc, 会彻底打乱逻辑。
之前我在SUSE内部团队讨论过这个事情,有工程师也发邮件给Dev列表讨论过这个事情,使得我们对于这个包的起因背景和要解决的问题已经比较清楚了。不得不说如果不大张旗鼓对每个包都review,如需要的话打上补丁使得每个包都支持使用%RPM_OPT_FLAGS或%optflags的话,确实目前使用包装gcc的方式的话是最具有实用性的。但是目前的实现方式上还是有一些问题:
安装时会修改gcc包的文件(/usr/bin/{gcc,g++,c++}),这样会破坏系统的完整性。并且使得使用rpm -V或者IMA等方式校验系统的时候发现gcc包被修改。编译器被修改是一个十分严重的安全事件,我第一次遇到的时候被吓了一跳。
gcc_secure没有打包实际的替换gcc binary的脚本,所有的操作都是在%post脚本中进行。这样对于这个包进行的操作无法方便的进行校验和audit。
gcc_secure %post阶段将一些文件放在了/tmp目录。而/tmp默认是tmpfs,系统重启后这些文件没有了,此时gcc命令(已经被替换成脚本)无法正常运行。由于glibc和gnulib两个包是BuildRequires gcc_secure的,因此如果用户尝试编译这两个包的srpm,就会破坏他本地的系统gcc。并且如欣蔚上面提到的,如果再update gcc包的话会打乱逻辑。
安装或不安装gcc_secure时gcc使用的编译参数是不一样的,并且这点隐藏得很深。不同的gcc编译参数可能会造成二进制兼容性的差异(仅怀疑,无直接证据)。并且现在只有glibc和gnulib是显式BuildRequires gcc_secure,其它包是因为OBS project配置而使用。这样造成用户在自己系统编译和OBS编译使用的是不同的gcc参数。
另外目前gcc_secure的实现上有些小问题:
%post中使用gcc_secure_exclude=`rpm --eval %{gcc_secure_exclude}`来将exclude的信息加入到gcc脚本。但是这里由于没有对%{gcc_secure_exclude}进行escape,造成这个宏在gcc_secure编译时就展开固定到%post脚本中的。这里应该使用%%{gcc_secure_exclude}(两个%%),使得宏的展开在gcc脚本运行阶段进行。(如果本意就是在gcc_secure编译阶段进行宏的展开,那么这里就没必要使用rpm --eval)
%post脚本将/usr/bin/{gcc,g++,c++} mv成了*_old,这个有点易误解,容易让人以为这是“旧版本”的binary。建议改成*.bin,与“script”相对应。
短期内如果无法对所有包都进行review加上必要的编译flag支持,必须要使用gcc_secure的话,我的建议是将gcc_secure直接集成到gcc包中,可以较好的解决以上提到的问题。具体如下:
对现有gcc spec进行修改。%install阶段将gcc/g++/c++等binary改名为*.bin。
安装两类wrapper脚本,gcc_original和gcc_secure。其中gcc_original脚本直接调用原版*.bin,不做任何修改,保证有原版的gcc/g++/c++供使用。gcc_secure脚本和目前的实现类似,但脚本本身和所需要的gcc配置spec等文件都以正常的文件形式存在并打包,不在%post等阶段使用脚本操作。
gcc_secure的脚本和相关文件可以放在一个单独的subpackage中。使用alternatives系统,供用户选择当前使用gcc_original还是gcc_secure。默认安装是gcc_original。在用户安装了gcc_secure后,调用update-alternatives,切换默认为gcc_secure(当然用户还是可以自己手动切换回原版gcc)。
脚本还是原来的脚本,但是是否使能可以通过openEuler-rpm-config配置,以及编译选项也由openEuler-rpm-config配置,替代spec直接写死的方式
Sign in to comment