Wieder ein Fall aus der Abteilung »Dinge die man noch nach 20 Jahren Linux entdeckt«: Ich habe gerade darauf gestoßen, dass man mit strace auch die Rückgabewerte von Syscalls verändern kann. Für die Option -e gibt es inject, womit man einen bestimmten Syscall verändern kann. Genaueres ist in der Manpage strace(1) im Abschnitt Tampering beschrieben.
Soll zum Beispiel der 3. Aufruf von openat mit ENOFILE fehlschlagen, so kann man diese mit folgendem Aufruf erreichen:
zsh
% strace -E LC_ALL=C -e trace=openat -e inject=openat:error=ENFILE:when=3 cat /proc/cmdline
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/proc/cmdline", O_RDONLY) = -1 ENFILE (Zu viele offene Dateien im System) (INJECTED)
cat: /proc/cmdline: Too many open files in system
+++ exited with 1 +++
Das kann man auch noch mit -P kombinieren, so dass zum Beispiel alle Zugriffe auf eine Datei fehlschlagen:
zsh
% strace -E PATH=/usr/local/bin:/usr/sbin:/usr/bin -P /usr/bin/uname -e inject=file:error=ENOENT sh -c uname
stat("/usr/bin/uname", 0x7ffc50321590) = -1 ENOENT (No such file or directory) (INJECTED) <0.000047>
sh: 1: uname: not found
+++ exited with 127 +++
Also alles schöne Möglichkeiten die Robustheit von Programmen zu prüfen oder Programme in gewisse Richtungen zu lenken, wenn sie nicht so recht wollen.