compiler-flags-hidden 警告訊息的說明在 https://qa.debian.org/bls/bytag/W-compiler-flags-hidden.html 可以看到。
裡面提到的
- https://wiki.debian.org/ReleaseGoals/SecurityHardeningBuildFlags
- https://wiki.debian.org/HardeningWalkthrough
- https://wiki.debian.org/Hardening
以 x11-touchscreen-calibrator 0.2-1 為例,將其編譯導向某個檔案儲存,然後再使用 blhc 指令來檢查,就可以看到:
$ blhc --all --color ../log NONVERBOSE BUILD: CC x11_touchscreen_calibrator-x11-touchscreen-calibrator.o NONVERBOSE BUILD: CCLD x11-touchscreen-calibrator
因為 x11-touchscreen-calibrator 上游將 Automake Silent Rules 預設開啟,然後 x11-touchscreen-calibrator 又只使用最簡單的 debian/rules 如下:
#!/usr/bin/make -f # -*- makefile -*- %: dh $@
然而 debhelper 到了 9.20140817 預設上還是不會將 --disable-silent-rules 自動加上使用,請見 https://wiki.debian.org/ReleaseGoals/VerboseBuildLogs 的資料。
不過在 Debian Bug report logs - #751207 在有設定 DH_VERBOSE 且 DH_VERBOSE 的值不為空字串的條件下,會自動加上 --disable-silent-rules,所以將 debian/rules 改寫成如下:
#!/usr/bin/make -f # -*- makefile -*- export DH_VERBOSE=1 %: dh $@
這樣就可以將 --disable-silent-rules 加上,而且有更詳細的套件包裹編譯過程,不過 blhc 的檢查還是會看到其它的訊息:
$ blhc --all --color ../log CFLAGS missing (-fPIE): gcc -DHAVE_CONFIG_H -I. -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -c -o x11_touchscreen_calibrator-x11-touchscreen-calibrator.o `test -f 'x11-touchscreen-calibrator.c' || echo './'`x11-touchscreen-calibrator.c LDFLAGS missing (-fPIE -pie -Wl,-z,now): libtool: link: gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z -Wl,relro -o x11-touchscreen-calibrator x11_touchscreen_calibrator-x11-touchscreen-calibrator.o -lX11 -lXi -lXrandr
這時候就可以將 debian/rules 改成如下:
#!/usr/bin/make -f # -*- makefile -*- export DH_VERBOSE=1 export DEB_CFLAGS_MAINT_APPEND=-fPIE export DEB_LDFLAGS_MAINT_APPEND=-fPIE -pie -Wl,-z,now %: dh $@
這樣就可以將缺少的 CFLAGS 跟 LDFLAGS 參數加入使用。
最後我們可以使用 hardening-check 來檢查一下執行檔。
使用前:
$ hardening-check /usr/bin/x11-touchscreen-calibrator /usr/bin/x11-touchscreen-calibrator: Position Independent Executable: no, normal executable! Stack protected: yes Fortify Source functions: yes Read-only relocations: yes Immediate binding: no, not found!
使用後:
$ hardening-check /usr/bin/x11-touchscreen-calibrator /usr/bin/x11-touchscreen-calibrator: Position Independent Executable: yes Stack protected: yes Fortify Source functions: yes Read-only relocations: yes Immediate binding: yes
這也是 W-compiler-flags-hidden 這個警告訊息想要讓我們做的事情,透過調整編譯時的參數來強化執行檔的安全性。