CVE-2026-68187 in Linux
Zusammenfassung
von VulDB • 10.08.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
exec: Korrektur des Überlaufs eines vorzeichenlosen Schleifenzählers in transfer_args_to_stack()
Der Stop-Wert wird aus bprm->p >> PAGE_SHIFT abgeleitet. Die Indexvariable ist ein unsigned long. Wenn bprm->p unter PAGE_SIZE fällt und stop zu null wird, ist die Schleifenbedingung index >= stop immer wahr.
Nach der Iteration mit index == 0 führt das Dekrementieren zum Überlauf auf ULONG_MAX, und bprm->page[ULONG_MAX] liert sizeof(void *) Bytes vor dem Array aus. Der Zeiger hat sich nach -1 gewickelt (wrapped). Dieser ungültige Zeiger wird anschließend an kmap_local_page() übergeben, und PAGE_SIZE Bytes werden von der Speicherstelle, auf die er zeigt, in den Stack des neu zu erstellenden Prozesses kopiert. Die Schleife terminiert ebenfalls nicht...
Um diesen Zustand zu erreichen, ist lediglich erforderlich, dass bprm->p < PAGE_SIZE gilt. Auf Systemen ohne MMU (nicht-MMU) sind bprm_set_stack_limit() und bprm_hit_stack_limit() leer. Daher besteht die einzige Einschränkung für das Abschieben von bprm->p nach unten in valid_arg_len(), d.h., dass jeder einzelne String noch in den verbleibenden Platz passt.
bprm->p beginnt bei PAGE_SIZE * MAX_ARG_PAGES - sizeof(void *), sodass ein einzelnes Argument oder eine Umgebungsvariable, die etwas mehr als 31 Seiten umfasst, diesen Wert auf die erste Seite zurücksetzt:
Oops - load access fault [#1]
CPU: 0 UID: 0 PID: 1 Comm: victim Not tainted 7.2.0-rc4 #1 epc : __memcpy+0xd4/0xf8 ra : transfer_args_to_stack+0xaa/0xae s4 : ffffffffffffffff s2 : 0000000000000000 a1 : ffffffdc98000000 a2 : 0000000000001000 status: 0000000a00001880 badaddr: ffffffdc98000000 cause: 0000000000000005 [] __memcpy+0xd4/0xf8
[] load_flat_binary+0x43a/0x65e
[] bprm_execve+0x1d4/0x316
[] do_execveat_common+0x12e/0x138
[] __riscv_sys_execve+0x38/0x4e
Kernel panic - not syncing: Fatal exception in interrupt
Dies ist eine obskure Schwachstelle, die dennoch behoben werden sollte.
Zählen Sie von MAX_ARG_PAGES abwärts herunter, sodass die Schleife endet, wenn index den Wert stop erreicht (inklusive stop == 0). Die durchgeführten Iterationen bleiben für jeden anderen Wert von stop unverändert.
Nur Builds mit CONFIG_MMU=n sind betroffen; transfer_args_to_stack() wird nur auf Systemen ohne MMU (nommu) von binfmt_flat und binfmt_elf_fdpic verwendet.
Die Schleife existiert bereits vor der git-Historie. Der Commit 7e7ec6a93434 („elf_fdpic_transfer_args_to_stack(): make it generic") hat sie lediglich von binfmt_elf_fdpic.c nach fs/exec.c verschoben und den Kopiervorgang auf den verwendeten Teil der ersten Seite beschränkt. Die Bedingung und das Dekrement sind seit 2.6.12-rc2 unverändert geblieben.
If you want to get best quality of vulnerability data, you may have to visit VulDB.