_IO_cookie_jumps abuse¶
Bir
_IO_cookie_file(fopencookiestream tipi) forge et; böylece bir stream operasyonu, ilk argümanı olarak attacker-kontrollü bir cookie ile attacker-kontrollü bir callback çağırır.
Mechanism¶
Note
fopencookie(), vtable'ı _IO_cookie_jumps olan bir struct _IO_cookie_file kurar.
Normal bir FILE'ın aksine, dört I/O callback'i (read/write/seek/close) FILE object'inin
içinde __io_functions field'ında saklanır ve user __cookie pointer'ı onların ilk
argümanı olarak geçilir. Stream read/write/close edildiğinde, _IO_cookie_read/write/seek/close
shim'leri eşleşen callback'i alır ve fn(cookie, ...) olarak çağırır. Bu, dış vtable'ı
meşru (in-range) _IO_cookie_jumps'a işaret ettirmenin ötesinde forge etmeyi gerektirmeyen
temiz bir arbitrary-call primitive'idir: attacker hem çağrılan pointer'ı hem de ilk argümanını
kontrol eder.
Walkthrough¶
Yapılar (glibc libio/iofopncook.c):
typedef struct {
cookie_read_function_t *read;
cookie_write_function_t *write;
cookie_seek_function_t *seek;
cookie_close_function_t *close;
} cookie_io_functions_t;
struct _IO_cookie_file {
struct _IO_FILE_plus __fp;
void *__cookie;
cookie_io_functions_t __io_functions;
};
Forge edilmiş bir cookie file'ı silaha dönüştürmek için:
- FILE
vtable = &_IO_cookie_jumpsayarla (in range — 2.24 kontrolünü geçer, bkz. io-vtable-check-bypass.md). __cookie="/bin/sh"adresini ayarla.__io_functions.write(ya dafclose'da erişilen.close) =systemayarla.- Stream üzerinde bir write/flush/close tetikle →
_IO_cookie_write(fp, ...)system("/bin/sh")çağırır.
Warning
Modern glibc cookie callback'lerini mangle eder: set_callbacks() store'da PTR_MANGLE
uygular ve _IO_cookie_* çağrıdan önce PTR_DEMANGLE uygular. Bu sürümlerde önce pointer
guard'ı leak'lemen/sıfırlaman gerekir, yoksa bu doğrudan bir çağrı yerine guarded bir çağrıya
dönüşür.
Detection¶
_IO_cookie_read/write/close'dan callback-olmayan adreslere indirect çağrılar.- glibc check build'leri; FILE virtual dispatch üzerinde CFI.
Mitigation¶
- Saklanan callback'lerin pointer-guard mangling'i (güncel glibc) yerinde savunmadır.
- glibc 2.24+ vtable range check'i gerçek
_IO_cookie_jumps'ın kullanılmasını zorunlu kılar.