Skip to content

_IO_cookie_jumps abuse

Bir _IO_cookie_file (fopencookie stream 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:

  1. FILE vtable = &_IO_cookie_jumps ayarla (in range — 2.24 kontrolünü geçer, bkz. io-vtable-check-bypass.md).
  2. __cookie = "/bin/sh" adresini ayarla.
  3. __io_functions.write (ya da fclose'da erişilen .close) = system ayarla.
  4. 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.

References