Sécurisation de son noyau avec Grsecurity et PaX

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Grsecurity & PaX

1.1 Introduction

Les buffers overflow et les scripts kiddies vous disent quelquechose ? Et bien pour parrer ce genre de problèmes, il existe un patch kernel. Il existe pleins de solution pour se protéger des attaques "classiques" mais complexes pour les pros (mais pas impossible). Voici donc LE patch kernel qui nous aide à nous protéger. Il existe même une phase d'apprentissage pour aider à la configuration du système. On se retrouve alors avec une solution très sécurisée.

http://www.grsecurity.net
http://pax.grsecurity.net
http://www.kernel.org

1.2 Installation des packages

Voici la liste des packages nécessaires à installer avant de passer au patch et à la recompilation noyau.

apt-get install paxctl paxtest chpax gradm2

1.3 Patch et recompilation du noyau

Maintenant, il faut télécharger le noyau et le patch Grsecurity. On va décompresser le noyau puis le patch :

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.*.tar.bz2
tar -xjvf linux-2.6.*.tar.bz2
wget http://www.grsecurity.net/grsecurity-*.patch.gz
gzip -d grsecurity-*.patch.gz

Il reste à patcher le noyau, faire les modifications comme bon vous semble (ou à partir de la doc Quickstart qui est la documentation officielle d'installation, ou encore plus d'explications sur le site) puis créer le kernel et l'installer :

ln -s linux-2.6.* linux
cd linux
patch -p1 < ../grsecurity-*.patch
make menuconfig
make-kpkg clean
make-kpkg --revision=1.0 kernel_image
dpkg -i ../linux-2.6.*.deb

1.4 Configuration du système

C'est bon, nous sommes prêt pour rebooter la bécane. Nous n'avons pas besoin comme le dit la doc de recompiler certains logiciels tel que gradm puisqu'ils existent en packages (merci Debian). Donc c'est plus simple à installer et ca permet d'être automatiquement à jour lorsque l'on fait des upgrades de distrib.

Voici quelques commandes qui vont nous être utile maintenant :

Démarrer le système : 
gradm -E
Arréter le système :
gradm -D
S'authentifier avec les droits administrateur :
gradm –a admin
Se désauthentifier des droits d'administrateur, sinon sortie de shell ou entrée :
gradm –u admin

Il faut s'assurer maintenant que tous nos services fonctionnent, que tout à démarrer correctement ! Si ce n'est pas le cas consultez la Faq

Maintenant que tout foncitonne correctement, nous allons passer au mode learning. Ce mode va apprendre tout ce que vous faites sur votre système afin de normaliser les actions. Une fois que vous pensez avoir fait tout ce que vous pensez de "normal". Nous allons désactiver ce mode learning afin de passer en prod. Cependant ne faites aucunes taches administratives de type start/stop des démons, ajout/suppressions d'utilisateurs/softs

Pour démarrer ce mode learning, voici la commande :

gradm –F –L /etc/grsec/learning.log

Une fois que l'apprentissage est fait (le laisser au moins 2 jours), nous pouvons l'arrêter :

gradm –F –L /etc/grsec/learning.log –O etc/grsec/acl

Voilà, il ne vous reste plus qu'a jetter des coups d'oeil dans les logs de Gradm pour voir les types de contre que votre kernel fait.

2 FAQ

2.1 Comment débugger ?

Pour débugger et voir les propriété mémoire au niveau d'une application :

strace /application

Et pour lire la mémoire au niveau d'une librairie :

readelf -e /usr/lib/librairy

2.2 error while loading shared libraries Permission denied

Et oui, tout ne fonctionne pas. Il arrive de récupérer ce type d'erreur. Pour vérifier l'état d'une application, voir comment elle va être gérée, lancez la commande chpax :

chpax --help               
chpax 0.7 .::. Manage PaX flags for binaries
Usage: chpax OPTIONS FILE1 FILE2 FILEN ...
  -P    enforce paging based non-executable pages
  -p    do not enforce paging based non-executable pages
  -E    emulate trampolines
  -e    do not emulate trampolines
  -M    restrict mprotect()
  -m    do not restrict mprotect()
  -R    randomize mmap() base [ELF only]
  -r    do not randomize mmap() base [ELF only]
  -X    randomize ET_EXEC base [ELF only]
  -x    do not randomize ET_EXEC base [ELF only]
  -S    enforce segmentation based non-executable pages
  -s    do not enforce segmentation based non-executable pages
  -v    view current flag mask 
  -z    zero flag mask (next flags still apply)

The flags only have effect when running the patched Linux kernel.

Ensuite, il faut essayer de vois ce qui ne va pas dans l'application :

chpax -v /usr/sbin/openvpn 

----[ chpax 0.7 : Current flags for /usr/sbin/openvpn (PemRxS) ]---- 

 * Paging based PAGE_EXEC       : enabled (overridden) 
 * Trampolines                  : not emulated 
 * mprotect()                   : restricted 
 * mmap() base                  : randomized 
 * ET_EXEC base                 : not randomized 
 * Segmentation based PAGE_EXEC : enabled

Là, on peut voir qu'il y a une restriction dans OpenVPN au niveau du mprotect. On peut donc contourner ceci en déprotégeant. Mais ce qui veut dire qu'on autorise une vulnérabilitée ici. Je vais donc déprotéger comme ceci :

chpax -m /usr/sbin/openvpn

Pour au final avoir ceci :

* mprotect()                   : not restricted

A ce moment là, mon application fonctionnera sans soucis :-)

2.3 Bind refuse de démarrer : permission denied

Celà arrive à cause d'un module kernel que vous n'avez soit pas compilé, soit justement activé en tant que module. Il faut alors l'implémenter dans le kernel.

CONFIG_SECURITY_CAPABILITIES=y

3 Ressources

Le fonctionnement de PaX
Hardening The Linux Kernel With Grsecurity