Sécurisation de son noyau avec Grsecurity et PaX
Contents
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
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