Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
LID — LID — Linux Integrity Drift: bypass di AppArmor tramite riscrittura dei pathname via eBPF. Manipolazione degli argomenti delle syscall pre-LSM con impronta di audit pari a zero. "Linux sta morendo" | Kitploit
Strumenti/GitHubGitHub/azqzazq1/lid
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitEvasione IDS/IPSPenetration TestingAnalisi di BinariPaper e RicercaApprendimento e FormazioneRed Teaming
GitHubazqzazq1/lid

LID

LID — Linux Integrity Drift: bypass di AppArmor tramite riscrittura dei pathname via eBPF. Manipolazione degli argomenti delle syscall pre-LSM con impronta di audit pari a zero. "Linux sta morendo"

20153 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Vedi Repository


``` ██╗ ██╗██████╗ ██║ ██║██╔══██╗ ██║ ██║██║ ██║ ██║ ██║██║ ██║ ███████╗██║██████╔╝ ╚══════╝╚═╝╚═════╝ ```

Linux Integrity Drift

— "Linux is Dying" —


Scoperta sistematica dei percorsi del kernel che aggirano le garanzie di sicurezza LSM
Il cancello non è mai stato forzato. È stato semplicemente aggirato.



Cos'è LID?

Il framework Linux Security Module ha una garanzia fondamentale che regge da 20+ anni:

I moduli di sicurezza possono solo aggiungere restrizioni. Non possono mai rimuoverle.

Questa garanzia è corretta. LID non la infrange.

LID trova percorsi del kernel che bypassano completamente gli hook LSM — sottosistemi che eseguono operazioni sensibili per la sicurezza senza consultare il framework LSM. Il controllo di sicurezza è corretto. Il problema è che il kernel non chiede mai.


Capire cosa è LID (e cosa non è)

Ogni scoperta ha due dimensioni distinte che non vanno confuse:

A) Divario di visibilità delle policy

Il punto cieco architetturale. La domanda non è "un attaccante può sfruttare questo?", ma:

  • Cosa vede realmente AppArmor/SELinux?
  • Cosa registra il log di audit?
  • Cosa osserva il tuo SIEM/EDR?
  • Cosa pensa sia successo il motore delle policy?

Se un'operazione sensibile per la sicurezza avviene e il livello di enforcement non la valuta nemmeno, hai un divario di visibilità — indipendentemente dal fatto che un attaccante possa abusarne praticamente oggi. Questo conta per conformità, forensics e assunzioni di difesa in profondità.

B) Percorso di escalation pratico

La domanda sulla sfruttabilità nel mondo reale:

  • Questo attraversa un confine di privilegi?
  • Un attaccante ha bisogno di root/CAP_BPF esistente per attivarlo?
  • È necessaria una catena di exploit, o è autonomo?
  • Qual è l'impatto effettivo — accesso ai dati, escalation di privilegi, evasione delle policy?

Queste due cose sono diverse. Una scoperta può essere un divario di visibilità critico (il tuo monitoring è cieco) senza essere un'escalation di privilegi pratica (l'attaccante ha già root). Al contrario, una scoperta può essere un percorso di escalation diretto con prerequisiti minimi.


Matrice di riproducibilità

Ogni scoperta ha requisiti specifici di kernel/config/privilegi. Se il tuo ambiente non corrisponde, la scoperta non si riprodurrà.

LID-001: Riscrittura del pathname eBPF

LID-002: io_uring MSG_RING

LID-004: Cecità di AppArmor verso BPF Token

LID-003: Nuova API di mount

LID-005: Bypass tc egress AF_XDP

Riferimento rapido: Cosa blocca ogni scoperta


Findings


Il Pattern

Ogni scoperta segue lo stesso pattern:``` ┌─────────────────────────────────────────────────────────────┐ │ THE LID PATTERN │ │ │ │ Kernel Subsystem A LSM Framework │ │ (eBPF / io_uring / mount API) (AppArmor / SELinux) │ │ │ │ ┌───────────────────┐ │ │ │ Performs operation │──── should call ──── security_*() │ │ │ or manipulates │ but │ │ │ security input │ DOESN'T ██ │ │ └───────────────────┘ │ │ │ │ The LSM framework is correct. │ │ The kernel just doesn't always use it. │ └─────────────────────────────────────────────────────────────┘

root@kitploit:~
Due sottosistemi del kernel. Presupposti di fiducia incompatibili. Una lacuna.

<br>

---

## LID-001: Riscrittura del pathname eBPF

**La scoperta principale.** Una kprobe BPF su `do_sys_openat2` riscrive il nome del file nella memoria utente prima che il kernel lo copi. AppArmor controlla il percorso riscritto e concede l'accesso. Zero tracce di audit.```
  process: open("/tmp/secret.txt")
       │
       ▼
  do_sys_openat2()
       │
    ★ LID kprobe fires here
    │  bpf_probe_write_user()
    │  rewrites "/tmp/secret.txt" → "/tmp/.bypass_link"
       │
       ▼
  getname_flags()          ← kernel copies the (rewritten) path
       │
       ▼
  security_file_open()     ← LSM hooks check "/tmp/.bypass_link"
       │                      AppArmor: ALLOW ✓
       ▼
  VFS opens inode          ← same file content (hard link)
       │
       ▼
  return fd to process     ← success, zero audit trace

Avvio rapido```bash

sudo ./scripts/check_prerequisites.sh sudo ./scripts/setup_env.sh make sudo ./scripts/setup_demo.sh sudo ./scripts/run_demo.sh

root@kitploit:~
### Output demo```
╔══════════════════════════════════════════════════════════╗
║  Phase 1: AppArmor ENFORCING — access should be DENIED   ║
╚══════════════════════════════════════════════════════════╝

  $ /tmp/test_reader
  [-] DENIED: open() failed: Permission denied (errno=13)

╔══════════════════════════════════════════════════════════╗
║  Phase 2: Loading LID — BPF kprobe pathname rewrite       ║
╚══════════════════════════════════════════════════════════╝

  [*] BPF kprobe attached to do_sys_openat2

╔══════════════════════════════════════════════════════════╗
║  Phase 3: With LID active — access should be GRANTED      ║
╚══════════════════════════════════════════════════════════╝

  $ /tmp/test_reader
  [+] SUCCESS: Read 44 bytes: SECRET_DATA=this_is_protected_content_12345

╔══════════════════════════════════════════════════════════╗
║  Phase 4: Stealth check — audit log inspection             ║
╚══════════════════════════════════════════════════════════╝

  $ dmesg | grep apparmor | grep DENIED
  (empty — no denial was ever generated)


LID-002: hook LSM mancante in io_uring MSG_RING

IORING_OP_MSG_RING con IORING_MSG_SEND_FD trasferisce descrittori di file tra anelli io_uring senza chiamare security_file_receive(). Ogni altro meccanismo di trasferimento di fd lo chiama:``` MSG_RING SEND_FD: __io_fixed_fd_install() ← NO security_file_receive() FIXED_FD_INSTALL: receive_fd() ← security_file_receive() ✓ SCM_RIGHTS: receive_fd() ← security_file_receive() ✓ binder: security_binder_transfer_file() ✓

root@kitploit:~
**Posizione del bug:** `io_uring/msg_ring.c`, `io_msg_install_complete()` — chiama direttamente `__io_fixed_fd_install()`, saltando l'hook LSM.

**Verificato con ftrace:** `security_file_receive` scatta per SCM_RIGHTS ma non per MSG_RING.

**Interessati:** Linux 5.18+ fino a v7.1-rc3 (non corretto al 2026-05-17).

**PoC:** [`findings/lid-002-iouring-msgring/msg_ring_bypass.c`](https://github.com/azqzazq1/lid/blob/main/findings/lid-002-iouring-msgring)

<br>

---

## LID-003: La nuova API mount bypassa AppArmor

La nuova API mount (`fsopen` + `fsconfig` + `fsmount` + `move_mount`) **non chiama mai `security_sb_mount()`** — l'unico hook mount implementato da AppArmor.```
  OLD API:  mount("proc", "/mnt", "proc", 0, NULL)
            → security_sb_mount()  → AppArmor: DENY ✗

  NEW API:  fsopen("proc") → fsconfig(CMD_CREATE) → fsmount() → move_mount()
            → security_sb_kern_mount()  → AppArmor: (not implemented) → ALLOW ✓

AppArmor registra 4 hook di mount. SELinux ne registra 14. La nuova API di mount usa hook che solo SELinux implementa.

Ulteriori lacune trovate:

  • open_tree(OPEN_TREE_CLONE): Zero hook di sicurezza — bypassa la politica di bind-mount
  • mount_setattr(): Non esiste alcun hook LSM nel kernel
  • move_mount() con mount staccati: AppArmor vede un percorso di origine NULL

Dettagli: findings/lid-003-mount-api/



LID-004: Token BPF — Copertura Zero di AppArmor

Il sottosistema dei token BPF (Linux 6.9+) delega le capacità BPF a processi non privilegiati negli user namespace. Il kernel definisce 9 hook LSM per BPF. SELinux li implementa tutti e 9 con una reale applicazione di avc_has_perm(). AppArmor ne implementa zero.``` Kernel defines 9 BPF LSM hooks: ┌─────────────────────────────────────────────────────────────────┐ │ bpf, bpf_map, bpf_prog, bpf_map_create, bpf_prog_load, │ │ bpf_token_create, bpf_token_free, bpf_token_cmd, │ │ bpf_token_capable │ └─────────────────────────────────────────────────────────────────┘

SELinux: ████████████████████████████ 9/9 implemented AppArmor: 0/9 implemented Smack: 0/9 implemented

root@kitploit:~
Su Ubuntu/Debian, un container con delega bpffs può:
- Creare token BPF → AppArmor non vede nulla
- Usare i token per caricare programmi di tracing → AppArmor non vede nulla
- Delegare CAP_PERFMON → disabilitare le mitigazioni Spectre → AppArmor non vede nulla

**Dettagli:** [`findings/lid-004-bpf-token/`](https://github.com/azqzazq1/lid/blob/main/findings/lid-004-bpf-token)

<br>

---

## LID-005: Bypass tc Egress AF_XDP dal Container Docker Predefinito

Il percorso di trasmissione in modalità copia di AF_XDP (`xsk_generic_xmit` → `__dev_direct_xmit`) **bypassa i classificatori di egress tc** sull'interfaccia del container. Verificato con tc u32 DROP-ALL — AF_PACKET bloccato, AF_XDP passa.

**Tuttavia:** Testato con Cilium v1.19 (cluster kind, NetworkPolicy di egress deny-all) — **Cilium NON è stato bypassato.** Cilium applica il controllo sul peer veth lato nodo in ingresso (`cil_from_container` tramite tcx/ingress) + verifica dell'IP sorgente. I pacchetti AF_XDP sono stati scartati come "Invalid source ip" in `bpf_lxc.c:1603`. L'impatto è limitato ad ambienti che si affidano esclusivamente ai classificatori di egress tc per la network policy (Docker semplice + regole tc, senza CNI).```
  Normal TX path:
  socket → dev_queue_xmit() → sch_handle_egress() → tc classifiers → driver
                                     ↑
                                  ENFORCED (Cilium eBPF, Calico, tc u32)

  AF_XDP copy-mode TX:
  xsk_sendmsg() → xsk_generic_xmit() → __dev_direct_xmit() → driver
                                              ↑
                                           SKIPPED (tc never runs)

Verificato dinamicamente sul kernel 6.8.0 con i container predefiniti di Docker:``` tc egress DROP-ALL on container eth0:

AF_PACKET sendto → ENOBUFS (BLOCKED by tc) AF_XDP sendto → 0 (BYPASS — 3 spoofed packets reached docker0 bridge)

root@kitploit:~
I pacchetti trasportano header Ethernet controllati dall'attaccante — MAC spoofato, IP spoofato — e raggiungono il bridge Docker nonostante una policy DROP attiva.

**PoC + dettagli:** [`findings/lid-005-afxdp-tc-bypass/`](https://github.com/azqzazq1/lid/blob/main/findings/lid-005-afxdp-tc-bypass)

<br>

---

## Architettura: perché BPF LSM non può risolvere questo problema```
  LSM Hook Chain: call_int_hook(file_open, ...)

  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
  │  Lockdown    │──>│  Capability  │──>│   AppArmor   │──>│  BPF LSM    │
  │  return 0    │   │  return 0    │   │  return -13  │   │  (never     │
  │  (allow)     │   │  (allow)     │   │  (DENY) ██   │   │   reached)  │
  └─────────────┘   └─────────────┘   └──────┬───────┘   └─────────────┘
                                              │
                                         loop breaks
                                         RC = -EACCES

  ★ The LSM framework is correct. No module can undo another's denial.
  ★ LID operates OUTSIDE the framework — before hooks run, or where hooks don't exist.

Compagno: SunnyDayBPF```

root@kitploit:~
               ┌───────────────────────────────────────┐
               │          THE ATTACK TIMELINE           │
               │                                       │

Syscall Entry │ ★ LID ─── manipulates input │ │ │ (security check sees wrong data) │ ▼ │ │ LSM Check │ LSM allows (or never runs) ✓ │ │ │ │ ▼ │ │ Syscall Exit │ ★ SunnyDayBPF ─── rewrites telemetry │ │ │ (monitoring sees wrong data) │ ▼ │ │ Audit/Log │ SIEM sees nothing ✓ │ │ │ │ Combined: ghost access │ └───────────────────────────────────────┘

root@kitploit:~
<br>

## Struttura del progetto```
LID/
├── src/
│   ├── bpf/
│   │   └── lid.bpf.c              # BPF kprobe — pathname rewriter (LID-001)
│   └── loader/
│       └── lid_loader.c           # Userspace loader + event monitor
├── findings/
│   ├── lid-001-ebpf-pathname/     # eBPF pathname rewriting bypass
│   ├── lid-002-iouring-msgring/   # io_uring MSG_RING missing LSM hook
│   │   ├── msg_ring_bypass.c      # PoC with ftrace verification
│   │   └── ADVISORY.md            # Technical advisory
│   ├── lid-003-mount-api/         # New mount API AppArmor bypass
│   ├── lid-004-bpf-token/        # BPF token AppArmor/Smack zero coverage
│   └── lid-005-afxdp-tc-bypass/  # AF_XDP tc egress bypass from container
├── tests/
│   └── test_reader.c              # Victim binary for LID-001 demo
├── scripts/
│   ├── check_prerequisites.sh     # Verify system requirements
│   ├── setup_env.sh               # Install build dependencies
│   ├── setup_demo.sh              # Create demo environment
│   ├── run_demo.sh                # Run full LID-001 demonstration
│   └── teardown.sh                # Clean up everything
├── docs/
│   └── RESEARCH.md                # Full technical research paper
├── publish/                       # Articles for Medium, dev.to, etc.
├── Makefile
├── LICENSE
├── SECURITY.md
└── README.md

Profilo Stealth (LID-001)


Mitigazioni

Per una guida dettagliata alle mitigazioni, vedere docs/RESEARCH.md.


Requisiti

Vedere la Matrice di riproducibilità per i dettagli completi di ogni riscontro. Riepilogo:


Autore

Azizcan Daştan
Milenium Security

  • GitHub: @azqzazq1

Esclusione di responsabilità

Questo strumento è pubblicato solo per test di sicurezza autorizzati, ricerca e scopi educativi. Non utilizzarlo su sistemi di cui non sei proprietario o per i quali non disponi di un'esplicita autorizzazione scritta al test.


LID — perché l'integrità non è mai stata bloccata.

Scarica lo strumento
FindingDivario di visibilitàEscalation pratica
LID-001Critico — AppArmor non vede nulla, log di audit vuoto, zero traccia forenseLimitato — richiede root o CAP_BPF+CAP_PERFMON (già privilegiato). Non è un'escalation di privilegi. Impatto: evasione delle policy + cecità dell'audit.
LID-002Alto — security_file_receive() non scatta mai, il trasferimento di fd è invisibile a tutti gli LSMAlto — funziona da userspace non privilegiato tramite io_uring. Attraversa il confine di enforcement LSM senza alcun privilegio.
LID-003Alto — security_sb_mount() bypassato, la policy di mount di AppArmor è codice mortoMedio — richiede accesso al mount namespace (CAP_SYS_ADMIN nella user ns). Disponibile in molte configurazioni container.
LID-004Critico — AppArmor non vede nulla, zero hook BPF (0/9), nessuna traccia di audit per qualsiasi operazione con BPF tokenMedio — richiede delega bpffs da parte dell'host + CAP_BPF nella user namespace. Disponibile nei runtime container con delega BPF (LXD/Incus).
LID-005Medio — i classificatori tc egress sull'interfaccia container non valutano mai il traffico AF_XDPLimitato — bypassa tc egress su eth0 del container (verificato). Cilium NON bypassato — applica il controllo sull'ingresso veth lato nodo + verifica IP sorgente (testato). Impatto limitato a setup Docker puri con filtro egress solo tc.
CondizioneRichiestaNote
Versione kernel5.x+Testato su 5.15, 6.1, 6.6, 6.8
CONFIG_BPF_SYSCALL=yDefault su tutte le principali distro
CONFIG_BPF_KPROBE_OVERRIDE=yUbuntu/Debian lo abilitano, RHEL no
CONFIG_SECURITY_APPARMOR=yLSM target deve essere AppArmor
Profilo AppArmorEnforcing, regola di deny sul path targetFunziona con qualsiasi regola di deny basata su path
Privilegiroot o CAP_BPF + CAP_PERFMONNon può essere eseguito senza privilegi
kernel.lockdownnone o integrityLa modalità confidentiality blocca l'attach dei kprobe
kernel.unprivileged_bpf_disabledIrrilevanteRichiede comunque CAP_BPF
fs.protected_hardlinks0 per link cross-user1 (default) consente comunque hard link stesso-utente
SELinux invece di AppArmorNon funzionaSELinux è basato su inode, non su pathname
CondizioneRichiestaNote
Versione kernel6.0+IORING_MSG_SEND_FD aggiunto in 6.0
CONFIG_IO_URING=yDefault su tutte le principali distro
PrivilegiNessunoFunziona da userspace non privilegiato
Sysctl io_uring_disabled0 (default)2 blocca i non privilegiati, 1 blocca tutti
LSM targetQualsiasi (SELinux, AppArmor, Smack)security_file_receive() è un hook LSM generico
kernel.lockdownIrrilevanteNessun BPF coinvolto
CondizioneRichiestaNote
Versione kernel6.9+BPF token introdotto in 6.9
CONFIG_BPF_SYSCALL=yDefault su tutte le principali distro
CONFIG_SECURITY_APPARMOR=yDefault Ubuntu/Debian
bpffs con delegaSìL'host deve montare con opzioni delegate_*
PrivilegiCAP_BPF nella user namespaceBanalmente disponibile per root userns
SELinux invece di AppArmorNon interessatoSELinux implementa tutti i 9 hook BPF
CondizioneRichiestaNote
Versione kernel5.2+fsopen/fsmount introdotti in 5.2
CONFIG_SECURITY_APPARMOR=ySolo AppArmor è interessato
PrivilegiCAP_SYS_ADMIN nella user namespaceDisponibile con unshare -m
SELinux invece di AppArmorNon funzionaSELinux implementa security_sb_kern_mount()
Runtime containerDipende dal filtro seccompIl seccomp default di Docker blocca fsopen — Podman/LXC potrebbero non bloccarlo
CondizioneRichiestaNote
Versione kernel4.18+AF_XDP introdotto in 4.18
CONFIG_XDP_SOCKETS=yDefault su tutte le principali distro
PrivilegiSolo CAP_NET_RAWDefault in Docker, pod Kubernetes
Runtime containerDocker, K8s, LXCSet di capability predefinito
Policy di rete basata su tcSìCilium eBPF, Calico, tc u32/flower
AmbienteLID-001LID-002LID-003LID-004LID-005
Ubuntu 22.04+ (AppArmor, default)FunzionaFunzionaFunzionaFunziona (6.9+)Funziona
Debian 12+ (AppArmor)FunzionaFunzionaFunzionaFunziona (6.9+)Funziona
RHEL/Fedora (SELinux)NoFunzionaNoNoFunziona
lockdown=confidentialityNoFunzionaFunzionaParzialmenteFunziona
Utente non privilegiatoNoFunzionaDipende dalla user nsDipende dalla delega bpffsNo
Container (senza CAP_BPF)NoDipende da io_uringDipende da seccompNoFunziona
Container (CAP_NET_RAW rimosso)NoDipendeDipendeNoNo
IDVettoreTargetCosa succede
LID-001Riscrittura pathname kprobe eBPFAppArmorIl kprobe riscrive il filename prima di copy_from_user → AppArmor controlla il path sbagliato
LID-002io_uring MSG_RING SEND_FDSELinux, AppArmor, SmackIl trasferimento di fd salta security_file_receive() — ogni altro trasferimento di fd lo chiama
LID-003Nuova API di mount (fsopen/fsmount)AppArmorsecurity_sb_mount() non viene mai chiamato — l'unico hook di mount di AppArmor è bypassato
LID-004Delega BPF tokenAppArmor, SmackZero hook BPF — creazione del token, utilizzo, delega delle capability completamente invisibili
LID-005AF_XDP __dev_direct_xmittc egress, Cilium, CalicoLa TX in copy-mode da Docker default bypassa i classificatori tc — i pacchetti spoofati raggiungono il bridge
IndicatoreVisibilitàNote
Log di audit di AppArmorNienteLa negazione non si verifica mai
auditd / journaldNienteNessun evento di sicurezza generato
dmesgAvviso una tantumMessaggio generico bpf_probe_write_user
bpftool prog listVisibileMostra la kprobe collegata (se controllato)
Hard link su discoRilevabilefind -samefile (lento, rumoroso)
MitigazioneEfficaciaCompromesso
kernel.lockdown=confidentialityBlocca completamente BPFElimina il monitoraggio legittimo
Disabilitare bpf_probe_write_userImpedisce la riscrittura del percorso di LID-001Richiede la ricompilazione del kernel
fs.protected_hardlinks=1Limita la creazione di hard linkPredefinito sui kernel moderni
Monitorare bpftool prog listRileva le probe collegateRichiede polling attivo
Migrare a SELinuxBasato su inode, vanifica la riscrittura del percorsoMigrazione complessa
Limitare io_uringBlocca LID-002Potrebbe rompere le applicazioni
RiscontroKernel minimoPrivilegiTarget
LID-0015.x+root / CAP_BPF+CAP_PERFMONSolo AppArmor
LID-0026.0+NessunoQualsiasi (SELinux, AppArmor, Smack)
LID-0035.2+CAP_SYS_ADMIN (user ns ok)Solo AppArmor
LID-0046.9+CAP_BPF (user ns ok)AppArmor, Smack
LID-0054.18+CAP_NET_RAW (predefinito di Docker)tc egress (Cilium, Calico, ecc.)