A Linux kernel fejlesztői levelezőlistán felmerült egy kérdés az ELF binárisok programfejléceinek méretkorlátozásával kapcsolatban. Yin Fengwei egy különleges esettel szembesült, amikor egy automatikusan generált assembly kódot fordított GCC-vel, amelynek eredményeként az elkészült ELF fájl 78 programfejléccel rendelkezett. Ez ARM64 platformon, 64 KB-os alapoldal-méret mellett gond nélkül indult, viszont 4 KB-os oldal-méret esetén már nem volt futtatható, és „Exec format error” hibát adott. A problémát a load_elf_phdrs() függvény vizsgálata során talált feltétel okozza, amely az ELF programfejlécek teljes méretét az ELF_MIN_ALIGN értékéhez köti, ami ARM64 esetében megegyezik a lapmérettel. Yin Fengwei rámutatott, hogy ha eltávolítja a size > ELF_MIN_ALIGN korlátozást, akkor a bináris 4 KB-os oldal-mérettel is működik, de nem talált hivatalos magyarázatot az ELF specifikációban erre a korlátozásra.
Tartalomjegyzék

Kees Cook mélyen belevetette magát a kernel kódtörténetébe
Kees Cook a kernel git-történetét vizsgálva próbálta kideríteni a korlátozás eredetét. A Linux-0.99.13 kiadásának idején még nem létezett ez a PAGE_SIZE-ellenőrzés, de az ELF értelmező (interpreter) támogatásának hozzáadása során, a 0.99.15f verzióban megjelent. Cook nem talált konkrét indoklást a változtatás mögött, csupán azt állapította meg, hogy a későbbi binfmt_elf módosítások során a PAGE_SIZE-ellenőrzést nemcsak az interpreterre, hanem az összes betöltésre kiterjesztették. Ebből arra következtet, hogy a korlátozás nem feltétlenül indokolt a mai körülmények között.
A javasolt megoldás és a kilátások
Cook felvetette, hogy a 64 KB-os határérték önmagában elegendő lehet a memóriafoglalások megakadályozására, különösen, hogy napjainkban már sokkal nagyobb memóriaigényű komponensekkel is dolgozik a kernel, például az IPC vagy a BPF alrendszerben. (Az IPC a folyamatok közötti ún. interprocessz kommunikációt, míg a BPF a kernelben futó kis, biztonságos programok révén megfigyelést és szűrést tesz lehetővé.) Ennek megfelelően javasolta a size > ELF_MIN_ALIGN feltétel eltávolítását, amely módosítással a korábban problémás ELF binárisok is elindíthatók lennének 4 KB-os oldal-méret mellett. A kérdés most az, hogy ez a változtatás nem ütközik-e más architektúrák vagy biztonsági elvárások szempontjaival, bár a jelenlegi megoldás inkább történeti maradványnak tűnik, mint valós szükségszerűségnek.
static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
/* Sanity check the number of program headers... */
/* ...and their total size. */
size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
- if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
+ if (size == 0 || size > 65536)
goto out;
elf_phdata = kmalloc(size, GFP_KERNEL);