Chapter 19. NetBSD Veriexec subsystem

Table of Contents

19.1. Come funziona
19.2. Signatures file
19.3. Generare le fingerprint
19.4. Livelli Strict
19.5. Veriexec e file system a strati
19.6. Configurazione del kernel

Veriexec è un sottosistema per l'integrità dei file di NetBSD basato sul kernel, quindi è in grado di fornire alcune protezioni anche in caso di una root compromessa. Questo capitolo è relativo solo alla versione di NetBSD 0.3 e successive.

19.1. Come funziona

Veriexec funziona caricando un file con le specifiche, chiamato anche signatures file (file delle firme, NdT), all'interno del kernel. Questo file contiene informazioni riguardanti i file che Veriexec dovrebbe monitorare, così come le loro fingerprint digitali (assieme agli algoritmi di hashing usati per produrre queste impronte), e varie flag che verranno discusse dopo.

Al momento i seguenti algoritmi di hashing sono supportati da Veriexec: MD5, SHA1, SHA256, SHA384, SHA512, e RMD160.

19.2. Signatures file

Una voce nel file delle firme di Veriexec appare come questa:

	/percorso/del/file algoritmo fingerprint flag

Dove il primo elemento, il percorso, deve sempre essere un percorso assoluto. L'algoritmo è uno di quelli mostrati sopra e fingerprint è la fingerprint digitale in ASCII.

19.3. Generare le fingerprint

É possibile generare fingerprint ASCII per ogni algoritimo usando i seguenti tool:

Table 19.1. Tool per i fingerprint di Veriexec

Algoritmo Tool
MD5 /usr/bin/cksum -a md5
SHA1 /usr/bin/cksum -a sha1
SHA256 /usr/bin/cksum -a sha256
SHA384 /usr/bin/cksum -a sha384
SHA512 /usr/bin/cksum -a sha512
RMD160 /usr/bin/cksum -a rmd160

Ad esempio, per generare un fingerprint MD5 per /bin/ls:

	% cksum -a md5 < /bin/ls
	a8b525da46e758778564308ed9b1e493

E per generare un fingerprint SHA512 per /bin/ps:

	% cksum -a sha512 < /bin/ps
	381d4ad64fd47800897446a2026eca42151e03adeae158db5a34d12c529559113d928a9fef9a7c4615d257688d1da4645db004081030d7f080bb7198067eb890

Ogni voce può essere associata con zero o più flag. Attualmente, queste flag indicano come l'accesso al file che la voce descrive dovrebbe essere effettuato. Nota che questo tipo di accesso è rispettato solo nel livello strict 2 (modalità IPS) e superiori.

I tipi d'accesso che è possibile utilizzare sono “DIRECT”, “INDIRECT” e “FILE”.

  • DIRECT significa che il file è eseguito direttamente e non viene invocato come un interpret per qualche script, o aperto con un editor. Solitamente, l'accesso a molti programmi viene effettuato utilizzando questa modalità:

    	% ls /tmp
    	% cp ~/foo /tmp/bar
    	% rm ~/foo
  • INDIRECT significa che il file è eseguito indirettamente, ed è invocato da un interprete o script. Questo in genere capita quando gli script hanno il magico #! come loro prima riga. Per esempio, se si ha uno script con la seguente prima linea:

    	#!/bin/sh

    E lo si esegue come:

    	% ./script.sh

    Allora /bin/sh sarà eseguito indirettamente -- sarà invocato per interpretare lo script.

  • FILE sono le voci che fanno riferimento a qualsiasi cosa non sia (o non dovrebbe essere) un eseguibile. Questo include librerie condivise, file di configurazione, etc.

    Alcuni esempi di voci per i file signature di Veriexec:

    	/bin/ls         MD5 dc2e14dc84bdefff4bf9777958c1b20b DIRECT
    	/usr/bin/perl   MD5 914aa8aa47ebd79ccd7909a09ed61f81 INDIRECT
    	/etc/pf.conf    MD5 950e1dd6fcb3f27df1bf6accf7029f7d FILE

Veriexec consente di specificare più di una via di accesso ai file in una voce. Per esempio, anche quando /usr/bin/perl è largamente utilizzato come interprete, si può desiderare di essere in grado di eseguirlo anche direttamente:

	/usr/bin/perl MD5 914aa8aa47ebd79ccd7909a09ed61f81 DIRECT, INDIRECT

Gli script per la shell che usano il magico #! per essere “eseguibili” necessitano anche di due tipi d'accesso: abbiamo bisogno di averli in modalità “DIRECT” così possiamo eseguirli, e abbiamo bisogno di averli in modalità “FILE” cosicchè il kernel possa indirizzare i loro contenuti all'interprete da loro definito:

	/usr/src/build.sh MD5 e80dbb4c047ecc1d84053174c1e9264a DIRECT, FILE

Per semplificare la creazione di file signature, e per rendere i file signature stesse più comprensibili, Veriexec consente di utilizzare i seguenti alias:

Table 19.2. Alias per i tipi d'accesso di Veriexec

Alias Espansione
PROGRAM DIRECT
INTERPRETER INDIRECT
SCRIPT DIRECT, FILE
LIBRARY FILE

Script di esempio per generare fingerprint sono disponibili in /usr/share/examples/veriexecctl. Dopo aver generato il file con le firme, dovrebbe salvarlo come /etc/signatures e abilitare Veriexec in rc.conf:

	veriexec=YES

19.4. Livelli Strict

Dal momento che persone differenti potrebbero voler usare Veriexec per scopi differenti, abbiamo bisogno di definire quattro livelli strict, nell'intervallo 0-3, e chiamarli modalità “learning”, “IDS”, “IPS” e “lockdown”.

Nel Livello strict 0, modalità learning, Veriexec agirà passivamente e avviserà semplicemente riguardo a ogni anomalia. Combinato con il livello verbose 1, eseguire il sistema in questa modalità può aiutare a monitorare il file delle firme. Questo è anche l'unico livello strict in cui è possibile caricar nuove voci nel kernel.

Livello strict 1, o modalità IDS, negherà l'accesso ai file con un fingerprint non riconosciuto. Questa modalità soddisfa per gran parte gli utenti che vogliono semplicemente prevenire l'accesso ai file che potrebbero essere stati modificati in modo malefico da un attaccante.

Strict level 2, IPS mode, takes a step towards trying to protect the integrity of monitored files. In addition to preventing access to files with a fingerprint mismatch, it will also deny write access and prevent the removal of monitored files, and enforce the way monitored files are accessed. (as the signatures file specifies).

Lockdown mode (strict level 3) can be used in highly critical situations such as custom made special-purpose machines, or as a last line of defense after an attacker compromised the system and we want to prevent traces from being removed, so we can perform post-mortem analysis. It will prevent the creation of new files, and deny access to files not monitored by Veriexec.

It's recommended to first run Veriexec in strict level 0 and verbose level 1 to fine-tune your signatures file, ensuring that desired applications run correctly, and only then raise the strict level (and lower the verbosity level). You can use /etc/sysctl.conf to auto raise the strict level to the desired level after a reboot:

	kern.veriexec.strict=1

19.5. Veriexec e file system a strati

Veriexec può essere usato su file system NFS lato client e su file system a strati (layered, NdT) come il file system union. I file che risiedono in questi file system necessitano solo di essere specificati nel file /etc/signatures e che i file system vengano montati prima che i fingerprint siano caricati.

Se si stà utilizzando un file system a strati allora ci si deve assicurare di aver incluso i fingerprint per i files che si vogliono proteggere ad ogni strato. Se si sbaglia nel fare questo qualcuno potrebbe sovrascrivere i file protetti da Veriexec utilizzando uno strato differente nella pila di un file system a strati. Questa limitazione potrebbe essere rimossa in future versioni di NetBSD.

É raccomandato, nel caso in cui non si utilizzi un file system a strati nè NFS, che queste funzioni siano disabilitate nella loro configurazione del kernel. Se si necessita di utilizzare file system a strati allora bisogna seguire le istruzioni nel paragrafo precedente ed assicurarsi che i file che si vogliono proteggere abbiano i fingerprint su tutti gli strati. Si dovrebbe anche aumentare il livello di sicurezza su 2 dopo che tutti i mount siano stati fatti:

	kern.securelevel=2

Per prevenire che i nuovi strati vengano montati i quali potrebbero compromettere la protezione di Veriexec.

19.6. Configurazione del kernel

Per usare Veriexec, oltre a creare un file delle firme, si dovrebbe abilitare (decommentare) la relativa voce nel file di configurazione del kernel (e.g. /usr/src/sys/arch/i386/conf/GENERIC):

	pseudo-device veriexec

Quindi, bisogna abilitare gli algoritmi di hashing che si desiderano supportare:

	options VERIFIED_EXEC_FP_MD5
	options VERIFIED_EXEC_FP_SHA1
	options VERIFIED_EXEC_FP_RMD160
	options VERIFIED_EXEC_FP_SHA512
	options VERIFIED_EXEC_FP_SHA384
	options VERIFIED_EXEC_FP_SHA256

Indipendentemente dalla versione del sistema operativo e dalla piattaforma, questi potrebbero essere già abilitati. Una volta fatto, ricompilare e reinstallare il kernel, vedere Chapter 31, Compiling the kernel per ulteriori instruzioni.

Se non si ha il device Veriexec /dev/veriexec, è possibile crearlo manualmente eseguendo il seguente comando:

# cd /dev
# sh MAKEDEV veriexec