42 votes

Quelle est la solution de contournement 'ptrace_scope' pour les programmes Wine et quels sont les risques ?

Pour exécuter certains programmes Windows dans WINE, vous devez contourner ce problème :

echo 0|sudo tee /proc/sys/kernel/yama/ptrace_scope

Selon les sites de support, cela est dû à un bug dans le noyau Ubuntu qui empêche ptrace et WINE de bien fonctionner ensemble.

En utilisant la commande ci-dessus, vous définissez ptrace sur 0, ce qui, selon les recherches que j'ai menées (ne me demandez pas quels sites web, j'en ai vu beaucoup), ptrace a à voir avec les interactions entre les programmes. Le réglage 0 est plus permissif que le 1.

Je dois supposer qu'Ubuntu avait de bonnes raisons de vouloir ptrace=1, ce qui me ramène à la forme abrégée de la question.

Y a-t-il des risques à définir ptrace=0. Une sécurité moindre? des problèmes de débogage? d'autres que je n'ai pas pensé ???

P.S. pour ceux qui lisent ceci et se demandent ce que le bug provoque, les programmes Windows ne s'ouvriront pas du tout, dans le Moniteur système, vous verrez de nombreuses instances du programme qui essaient de s'ouvrir puis finissent par quitter toutes et si vous exécutez le programme depuis le terminal, vous obtiendrez une erreur qui vous indique que le nombre maximum d'instances de programme a été atteint.

49voto

ish Points 134738

Réponse courte : aucun danger pratique pour le moment, mais continuez à lire pour une meilleure solution...


Qu'est-ce que cette chose ptrace ?

cela est dû à un bug dans le noyau Ubuntu qui empêche ptrace et WINE de bien fonctionner ensemble.

  • Non, la protection ptrace est une mesure de sécurité délibérée du noyau introduite pour la première fois vers Ubuntu 10.10. Ce n'est pas un bug, et donc ne sera pas "corrigé".

  • En termes simples, la valeur par défaut ptrace_scope de 1 bloque un processus d'examiner et de modifier un autre processus à moins que le deuxième processus (enfant) ait été démarré par le premier processus (parent).

  • Cela peut causer des problèmes avec certains programmes sous Wine en raison de la manière dont wineserver fournit des "Services Windows" à ces programmes.

Quels sont les risques de définir ptrace_scope sur 0 ?

  • Cela rétablit l'ancien comportement où un processus peut "tracer" un autre processus, même s'il n'y a pas de relation parent-enfant.

  • En théorie, un malware peut l'utiliser pour vous nuire/votre ordinateur ; par exemple, il peut se connecter à Firefox et enregistrer tous vos URL/mots de passe, etc. En pratique, cela est extrêmement improbable à moins que vous installiez aveuglément des paquets binaires à partir de sites aléatoires, etc.

  • En ce qui concerne le débogage, le paramètre 0 est en fait requis pour permettre à gdb, strace, etc. de se connecter à des processus non-enfants sauf si vous les exécutez avec des privilèges élevés (sudo).

Quels sont les problèmes avec la solution de contournement ?

  • La solution de contournement est quelque peu problématique car ptrace_scope est une valeur globale, et tant qu'elle est définie sur 0, tous les processus sur votre système sont exemptés de la restriction non-enfant.
  • Si vous utilisez la solution de contournement, mettez-la dans un simple script bash qui l'active, exécute votre programme Windows puis la désactive (la définir sur 1) à la sortie.
    • NE FAITES PAS de ptrace_scope accessible en écriture pour tous (666) comme le recommande le post du forum -- c'est un énorme risque de sécurité car maintenant n'importe quel processus peut le modifier à volonté !

Y a-t-il une meilleure solution ?

  • Une meilleure solution qui est plus sécurisée et ne nécessite pas de modifier continuellement ptrace_scope est de accorder des capacités de ptrace à Wineserver.

    • Dans un terminal :

      sudo apt-get install libcap2-bin 
      sudo setcap cap\_sys\_ptrace=eip /usr/bin/wineserver
      sudo setcap cap\_sys\_ptrace=eip /usr/bin/wine-preloader
    • Cela exempte les fichiers binaires wineserver et wine-preloader de la restriction de ptrace non-enfant, et leur permet de ptracer n'importe quel processus.

    • Cela doit être fait une seule fois, et est plus sûr car ces binaires proviennent généralement d'une source de confiance - les référentiels officiels ou le PPA Wine officiel, donc ils ne seront pas des malwares.

Si vous utilisez Crossover

Installez libcap2 :

sudo apt-get install libcap2-bin;

Ensuite, ajoutez une exception pour Crossover :

sudo setcap cap\_sys\_ptrace=eip /opt/cxoffice/bin/wineserver;
sudo setcap cap\_sys\_ptrace=eip /opt/cxoffice/bin/wine-preloader;

Enfin, ajoutez ses bibliothèques à ld.so.conf (ou vous obtiendrez "erreur lors du chargement des bibliothèques partagées : libwine.so.1 : impossible d'ouvrir le fichier d'objet partagé : Aucun fichier ou dossier de ce type") :

echo /opt/cxoffice/lib/ | sudo tee /etc/ld.so.conf.d/crossover.conf
sudo /sbin/ldconfig

5voto

TrailRider Points 6819

Dans les ubuntuforums.org, j'ai obtenu une réponse avec le lien suivant

https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace_Protection

voici l'extrait du lien (avec mon accent mis en évidence)

À mesure que Linux gagne en popularité, il deviendra une cible croissante pour les logiciels malveillants. Une faiblesse particulièrement préoccupante des interfaces de processus Linux est qu'un seul utilisateur est capable d'examiner la mémoire et l'état d'exécution de l'un de ses processus. Par exemple, si une application (par ex. firefox) était compromise, il serait possible pour un attaquant de se connecter à d'autres processus en cours d'exécution (par ex. gpg-agent) pour extraire des informations d'identification supplémentaires et continuer à étendre la portée de leur attaque.

Ce n'est pas un problème théorique. Le détournement de session SSH et même l'injection de code arbitraire est tout à fait possible si ptrace est autorisé normalement.

Pour une solution, certaines applications utilisent prctl() pour interdire spécifiquement une telle attache ptrace (par ex. ssh-agent). Une solution plus générale est de n'autoriser ptrace que directement d'un parent à un processus enfant (c'est-à-dire que gdb direct et strace fonctionnent toujours), ou en tant qu'utilisateur root (c'est-à-dire que gdb BIN PID et strace -p PID fonctionnent toujours en tant que root).

Ce comportement est contrôlé via la valeur sysctl /proc/sys/kernel/yama/ptrace_scope. La valeur par défaut est "1" pour bloquer le ptrace non enfant. Une valeur de "0" restaure le comportement plus permissif précédent, ce qui peut être plus approprié pour certains systèmes de développement et serveurs avec uniquement des comptes administrateurs. L'utilisation de "sudo" peut également accorder temporairement des autorisations de ptrace via la capacité CAP_SYS_PTRACE, bien que cette méthode permette le ptrace de n'importe quel processus.

Donc je suppose que la réponse brève serait que c'est moins sécurisé mais la probabilité qu'un ordinateur personnel soit exposé à ce type d'attaques serait assez faible.

1voto

MISE À JOUR Les instructions ci-dessus :

sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wineserver;
sudo setcap cap_sys_ptrace=eip /opt/cxoffice/bin/wine-preloader;

ne fonctionnent pas à partir du 15/09/2018 sur Ubuntu 18.04.1 et PlayOnLinux v.4.2.12 en utilisant la dernière version stable de Wine qui est v.3.0.1 libcap2 était déjà installé.

Le message d'erreur dans le terminal Gnome est le suivant :

Failed to set capabilities on file `/usr/bin/wineserver' (Invalid argument)
The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

Je ne sais pas ce que cela signifie... mais je voulais le partager pour que quelqu'un puisse l'interpréter et peut-être trouver une nouvelle solution fonctionnelle.

Merci.

0voto

Lorenz Points 1

Sous Ubuntu 19.10 /usr/bin/wineserver et /usr/bin/wine-preloader sont en fait des liens symboliques et non des fichiers. Cela s'applique probablement également à la version 18.04. J'ai vu la solution suivante dans un autre message, que je ne peux plus retrouver. Essayez ceci à la place :

sudo setcap cap_sys_ptrace=eip "$(readlink -f "/usr/bin/wineserver")"
sudo setcap cap_sys_ptrace=eip "$(readlink -f "/usr/bin/wine-preloader")"

En fonction du paquet wine que vous utilisez, vous devez ajouter quelque chose comme : echo /opt/wine-stable/lib/ | sudo tee /etc/ld.so.conf.d/wine.conf ou : echo /opt/wine-staging/lib/ | sudo tee /etc/ld.so.conf.d/wine.conf suivi de : sudo /sbin/ldconfig

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X