124 Star 0 Fork 19

src-openEuler / gcc_secure

 / 详情

gcc_secure 的实现方案不够友好,可以集成到openEuler-rpm-config中

已挂起
Requirement
Opened this issue  
2020-03-27 15:06

RT

Comments (6)

hexiaowen created任务
hexiaowen set related repository to src-openEuler/gcc_secure
Expand operation logs

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.

hexiaowen added
 
kind/enhancement
label
hexiaowen set branch to master
hexiaowen set top level to Low
hexiaowen set priority to Secondary
hexiaowen set assignee to hexiaowen
hexiaowen changed issue type from 任务 to 需求
Zhou_Ang added
 
block
label
Zhou_Ang removed
 
block
label
Zhou_Ang added
 
block
label
Zhou_Ang removed
 
block
label
Yang.Li changed issue state from 待办的 to 新建

gcc_securec 是对gcc进行封装替换。
从openEuler-rpm-config中添加,只能覆盖使用autoconf生成makefile的软件。直接使用makefile/gcc命令编译的软件无法正常添加编译选项。
目前没有更好的方案,任务挂起

hexiaowen changed issue state from 新建 to 已挂起
solarhu added
 
help-wanted
label
solarhu removed
 
help-wanted
label

gcc_securec 是对gcc进行封装替换。
从openEuler-rpm-config中添加,只能覆盖使用autoconf生成makefile的软件。直接使用makefile编译的软件无法正常添加编译选项。
目前没有更好的方案,任务挂起

@hexiaowen 我觉得至少有个 %preun 的部分,能够支持卸载掉这个修改。
然后这个 rpm 的逻辑本身也是有问题,他相当于修改了另外一个包的软件,那在安装 gcc_secure 以后去升级 gcc, 会彻底打乱逻辑。

之前我在SUSE内部团队讨论过这个事情,有工程师也发邮件给Dev列表讨论过这个事情,使得我们对于这个包的起因背景和要解决的问题已经比较清楚了。不得不说如果不大张旗鼓对每个包都review,如需要的话打上补丁使得每个包都支持使用%RPM_OPT_FLAGS或%optflags的话,确实目前使用包装gcc的方式的话是最具有实用性的。但是目前的实现方式上还是有一些问题:

  1. 安装时会修改gcc包的文件(/usr/bin/{gcc,g++,c++}),这样会破坏系统的完整性。并且使得使用rpm -V或者IMA等方式校验系统的时候发现gcc包被修改。编译器被修改是一个十分严重的安全事件,我第一次遇到的时候被吓了一跳。

  2. gcc_secure没有打包实际的替换gcc binary的脚本,所有的操作都是在%post脚本中进行。这样对于这个包进行的操作无法方便的进行校验和audit。

  3. gcc_secure %post阶段将一些文件放在了/tmp目录。而/tmp默认是tmpfs,系统重启后这些文件没有了,此时gcc命令(已经被替换成脚本)无法正常运行。由于glibc和gnulib两个包是BuildRequires gcc_secure的,因此如果用户尝试编译这两个包的srpm,就会破坏他本地的系统gcc。并且如欣蔚上面提到的,如果再update gcc包的话会打乱逻辑。

  4. 安装或不安装gcc_secure时gcc使用的编译参数是不一样的,并且这点隐藏得很深。不同的gcc编译参数可能会造成二进制兼容性的差异(仅怀疑,无直接证据)。并且现在只有glibc和gnulib是显式BuildRequires gcc_secure,其它包是因为OBS project配置而使用。这样造成用户在自己系统编译和OBS编译使用的是不同的gcc参数。

另外目前gcc_secure的实现上有些小问题:

  1. %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)

  2. %post脚本将/usr/bin/{gcc,g++,c++} mv成了*_old,这个有点易误解,容易让人以为这是“旧版本”的binary。建议改成*.bin,与“script”相对应。

短期内如果无法对所有包都进行review加上必要的编译flag支持,必须要使用gcc_secure的话,我的建议是将gcc_secure直接集成到gcc包中,可以较好的解决以上提到的问题。具体如下:

  1. 对现有gcc spec进行修改。%install阶段将gcc/g++/c++等binary改名为*.bin。

  2. 安装两类wrapper脚本,gcc_original和gcc_secure。其中gcc_original脚本直接调用原版*.bin,不做任何修改,保证有原版的gcc/g++/c++供使用。gcc_secure脚本和目前的实现类似,但脚本本身和所需要的gcc配置spec等文件都以正常的文件形式存在并打包,不在%post等阶段使用脚本操作。

  3. 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

Status
Assignees
Projects
Milestones
Pull Requests
Successfully merging a pull request will close this issue.
Branches
Planed to start   -   Planed to end
-
Top level
Priority
Duration (hours)
参与者(6)
5329419 openeuler ci bot 1632792936 5324761 overweight 1578984558
1
https://gitee.com/src-openeuler/gcc_secure.git
git@gitee.com:src-openeuler/gcc_secure.git
src-openeuler
gcc_secure
gcc_secure

Search