2014年9月13日 星期六

解決 Debian packaging 過程中的 compiler-flags-hidden 警告訊息

compiler-flags-hidden 警告訊息的說明在 https://qa.debian.org/bls/bytag/W-compiler-flags-hidden.html 可以看到。

裡面提到的

可以參考一下,其主要的目的是要盡可能地強化執行檔的安全性。

以 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 這個警告訊息想要讓我們做的事情,透過調整編譯時的參數來強化執行檔的安全性。

張貼留言