読者です 読者をやめる 読者になる 読者になる

open(2)でO_CREAT or O_TMPFILEを使うときはmodeのセットを忘れずに

linux

Linux Kernelのfauzzingツールとして有名trinityを動かすとすぐにこんなエラーが出て止まりました。

[main] fd[419] = fopen /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-Virtual-2/edid (read-only) flags:0 fcntl_flags:0
*** invalid open call: O_CREAT or O_TMPFILE without mode ***: ./trinity terminated
======= Backtrace: =========
/usr/lib/libc.so.6(+0x72055)[0x7f3b3bd2b055]
/usr/lib/libc.so.6(__fortify_fail+0x37)[0x7f3b3bdb25c7]
/usr/lib/libc.so.6(+0xdbf6f)[0x7f3b3bd94f6f]
./trinity[0x4146c6]
./trinity(open_fds+0x2e)[0x413dfe]
./trinity(main+0x1be)[0x40ba3e]
/usr/lib/libc.so.6(__libc_start_main+0xf0)[0x7f3b3bcd9610]
./trinity(_start+0x29)[0x40bde9]
======= Memory map: ========

フラグにO_CREAT or O_TMPFILEを設定している場合はmodeをセットしろということなので、とりあえずこのようにして対応。

diff --git a/fds/files.c b/fds/files.c
index 98dbf33..938b19f 100644
--- a/fds/files.c
+++ b/fds/files.c
@@ -321,7 +321,7 @@ retry_flags:

        if (RAND_BOOL()) {
                randflags = get_o_flags();
-               fd = open(filename, flags | randflags | O_NONBLOCK);
+               fd = open(filename, flags | randflags | O_NONBLOCK, 0666);
        } else {
                fd = open_with_fopen(filename, flags);
                fcntl_flags = random_fcntl_setfl_flags();

リバースエンジニアリング ―Pythonによるバイナリ解析技法 (Art Of Reversing)

リバースエンジニアリング ―Pythonによるバイナリ解析技法 (Art Of Reversing)