PIE randomization


前の記事にコメントをいただいて、PIE randomizationのことを思い出したので、ちょい実験。PIEな実行ファイルは、どのアドレスにロードしても動くので、どこにロードするかはカーネルのfs/binfmt_elf.cあたりが適当に決めることが可能なわけですが、私の使ってるカーネルさんはPIEを毎回異なるランダムなアドレスにロードする(PIE randomization, aka ASLR)のか、それともどこか固定なアドレスにロードするのかを確かめたということです。


というのも、私は主にFedoraを使っているのですが、2.6.18-1.2798.fc6 では効いていたPIEのrandomizationが 2.6.22.4-45.fc6 とか 2.6.22.9-61.fc6 (今日現在の最新版) では効かなくなっておりまして。カーネルのメインラインのほうでも2006年末から似たようなコードのcommitとrevertを2-3回繰り返しているもので*1、結局どうなったんかなーと思い。昨日Fedoraの8を入れたので状況確認と。確認作業は簡単です。

#include <stdio.h>
int main() {
here:
  printf("%p\n", &&here); // mainのアドレスでもいいけど
  return 0;
}

をFedora8の2.6.23.1-49.fc8で実行するだけ。

% gcc -fPIE -pie pie.c
% ./a.out
0xb7fca539
% ./a.out
0xb7f23539
% ./a.out
0xb7f45539
% ./a.out
0xb7f06539

お、またrandomizeが効くようになってる。src.rpmを見ると、linux-2.6-execshield.patch にそういうコードが入っているようですね。binfmt_elf.cへの数行パッチ。以上、思い出したので実験&メモでした。いま翻訳している本*2 の事前調査も兼ねつつ。あ、もうひとつ、protection mechanismといえば、glibc-2.7で -D_FORTIFY_SOURCE=2がCだけでなくC++にも対応したので、Binary Hacksの記述が少し古くなりました。

*1:Fedoraのpatchはこれとは別系統っぽいですが、メインラインにあわせてパッチを有効にしたり無効にしたりしているように見えた

*2:The Shellcoder's Handbook: Discovering and Exploiting Security Holes (2nd edition) という本の、(攻撃云々はわからんので) 14章 Protection Mechanisms およびLinux/ELF関連のとこだけ。