I ricercatori di ARMO hanno dimostrato la possibilità di creare rootkit che non utilizzano chiamate di sistema specifiche per eseguire operazioni comuni, come la lettura/scrittura di file e la ricezione di comandi da un server esterno. Invece delle chiamate di sistema per operazioni di rete e file, è stato proposto di utilizzare l'interfaccia di input/output asincrono io_uring, supportato a partire dal kernel Linux 5.1.
L'essenza del metodo consiste nel fatto che, invece di singole chiamate di sistema per accedere a file e svolgere operazioni di rete (read/write, recv/send/connect/bind/listen), si possono utilizzare chiamate di sistema generali di io_uring (io_uring_enter, io_uring_setup, io_uring_register, ecc.), che non vengono analizzate dagli strumenti comuni per individuare attività dannose. L'interfaccia io_uring supporta circa 60 operazioni diverse. È in fase di sviluppo una funzionalità che consente di avviare nuovi processi tramite io_uring.
Per dimostrare il funzionamento del metodo, è stato preparato un prototipo di rootkit chiamato Curing, che esegue azioni come la ricezione di comandi da un host esterno server e la trasmissione/modifica di file. Nella dimostrazione è stata inviata una richiesta alla porta TCP 8888 di un host esterno e inviato il contenuto del file '/etc/shadow'. Si presume che, dopo una compromissione di sistema e l'ottenimento dei diritti root, l'attaccante installi il rootkit per consolidare la propria presenza nel sistema compromesso.
Nell'esperimento condotto, l'attività del rootkit Curing è stata inosservata dagli strumenti di monitoraggio Falco e Tetragon, utilizzati per rilevare anomalie legate alla sicurezza sugli host e nei container (è supportata l'integrazione con infrastrutture basate su Kubernetes). Questi strumenti utilizzano l'intercettazione delle chiamate di sistema per analizzare eventi come l'avvio di processi, l'attività di rete e la gestione dei file, ma non considerano la possibilità di utilizzare la sottosistema io_uring per tali operazioni. Gran parte dei sistemi commerciali di rilevamento e risposta agli incidenti di sicurezza disponibili per Linux si basa anch'essa sull'intercettazione delle chiamate di sistema.
Per evitare di aggirare gli strumenti di monitoraggio delle attività di rete e file, è raccomandato utilizzare il meccanismo KRSI (Kernel Runtime Security Instrumentation), introdotto nel kernel Linux 5.7, che consente di collegare programmi BPF a qualsiasi hook LSM. Ad esempio, KRSI a livello di hook LSM consente di monitorare le operazioni sui file, l'accesso di rete e l'avvio di processi, indipendentemente dal fatto che tali operazioni siano state avviate tramite chiamate di sistema specifiche o tramite io_uring.
In precedenza, il sottosistema io_uring era stato oggetto di critiche a causa delle gravi vulnerabilità che emergono regolarmente. In risposta alle richieste degli utenti che desiderano uno strumento semplice per disabilitare io_uring senza ricompilare il kernel, è stato aggiunto al kernel Linux 6.6 il sysctl io_uring_disabled. Google ha disabilitato io_uring per impostazione predefinita in ChromeOS, Android e nei suoi server, spiegando che la situazione preoccupante della sicurezza in io_uring supera i vantaggi di utilizzare io_uring per migliorare le prestazioni.
Fonte: opennet.ru
