Faisant suite à l’article sur Lutris (https://blog.ingeservice.fr/2026/02/08/les-jeux-sur-linux-lutris), il y a l’aspect sécurité que j’aimerai aborder avec vous.
1) Lutris et la gestion des authentifiants
Lutris nous demande nos identifiants pour avoir accès à nos bibliothèques de jeux (ici GOG pour le test). Peut-on avoir confiance ?
Stockage local
L’authentification à GOG se fait via un token qui est stocké en local dans un répertoire caché dans le home de l’utilisateur courant :
alex@y510p:~$ ls -lha ~/.cache/lutris/
total 88K
drwxr-xr-x 7 alex alex 4.0K Jun 29 12:19 .
drwxr-xr-x 52 alex alex 4.0K Jun 29 11:37 ..
drwxr-xr-x 3 alex alex 4.0K Jun 29 12:19 ea_app
-rw-r--r-- 1 alex alex 100 Jun 29 12:18 game-paths.json
drwxr-xr-x 3 alex alex 4.0K Jun 29 11:37 gog
-rw-r--r-- 1 alex alex 672 Jun 29 11:42 .gog.auth
-rw-r--r-- 1 alex alex 13K Jun 29 11:42 gog-library.json
-rw-r--r-- 1 alex alex 423 Jun 29 11:42 .gog.token
drwxr-xr-x 2 alex alex 4.0K Jun 29 12:05 installer
-rw-r--r-- 1 alex alex 8.1K Jun 29 12:18 lutris.log
-rw-r--r-- 1 alex alex 0 Jun 29 11:35 lutris.log.1
drwxr-xr-x 3 alex alex 4.0K Jun 29 11:59 shaders
drwxr-xr-x 2 alex alex 4.0K Jun 29 11:35 tmp
-rw-r--r-- 1 alex alex 17K Jun 29 11:35 versions.json
Lutris utilise le fichier caché gog.token pour se connecter à notre compte GOG.
Oui mais encore ? Comment être sûr que le token n’est pas utilisé ou extrait là où il ne faut pas ?
Analyseur réseau
On peut tester de voir ce qui sort de notre réseau via un analyseur réseau comme Wireshark.
Si on est plusieurs sur le même réseau, on filtre pour n’avoir les résultat correspondant uniquement à l’adresse MAC de notre carte réseau (ce trouve via la commande ip a). On aurait pu aussi filtrer sur notre adresse ip.
Note :désactiver le mode promiscuité n’a pas suffit pour moi.
Lorsqu’on arrive sur le formulaire de connexion GOG dans Lutris, voilà ce qui se passe dans Wireshark :

On observe des connexions entre notre machine et un serveur distant qui porte l’ip 151.101.193.55 qui correspond bien à gog.com

Un handshake TLS pour sécuriser l’échange HTTP qui est en train d’avoir lieu se produit.
En retournant sur la trame 17, on observe les différentes IP possibles de gog.com :
- 151.101.193.55
- 151.101.129.55
- 151.101.1.55
- 151.101.65.55
Avec cette information là, on peut filtrer sur ces ip là pour se concentrer sur les bonnes trames :
ip.addr==151.101.193.55 || ip.addr==151.101.129.55 || ip.addr==151.101.1.55 || ip.addr==151.101.65.55
On s’authentifie enfin à GOG via Lutris et on observe ça :

Il n’y a pas d’autres trames correspondantes aux IP de gog.com après ça. (trame 9694)
On refiltre sur notre MAC (ou notre ip) pour voir ce qu’il y a après :
ip.addr==151.101.193.55 || ip.addr==151.101.129.55 || ip.addr==151.101.1.55 || ip.addr==151.101.65.55 || ip.addr==192.168.1.199

On voit qu’une requête DNS est fait pour obtenir les IP de lutris.net (trame 9697) qui sont :
- 104.21.64.1
- 104.21.16.1
- 104.21.80.1
- 104.21.32.1
- 104.21.96.1
- 104.21.112.1
- 104.21.48.1
On peut filtrer sur ces IP là voir ce qui se passe :
ip.addr==104.21.64.1 || ip.addr==104.21.16.1 || ip.addr==104.21.80.1 || ip.addr==104.21.32.1 || ip.addr==104.21.96.1 || ip.addr==104.21.112.1 || ip.addr==104.21.48.1
Aucune trame.
Trame 9698, on voit aussi les adresses IPv6 de lutris.com qui sont :
- 2606:4700:3030::6815:4001
- 2606:4700:3030::6815:7001
- 2606:4700:3030::6815:1001
- 2606:4700:3030::6815:3001
- 2606:4700:3030::6815:2001
- 2606:4700:3030::6815:6001
- 2606:4700:3030::6815:5001
On peut filtrer sur ces IP là :
ipv6.addr==2606:4700:3030::6815:4001 || ipv6.addr==2606:4700:3030::6815:7001 || ipv6.addr==2606:4700:3030::6815:1001 || ipv6.addr==2606:4700:3030::6815:3001 || ipv6.addr==2606:4700:3030::6815:2001 || ipv6.addr==2606:4700:3030::6815:6001 || ipv6.addr==2606:4700:3030::6815:5001
On observe quelques échanges de données :

Il faudrait déchiffrer l’échange pour voir ce qui a été envoyé. C’est possible !
On créé la variable d’environnement SSLKEYLOGFILE :
export SSLKEYLOGFILE=$HOME/sslkeylog.log
Dans Wireshark, dans le menu “Preferences” on va dans “Protocols/TLS”, dans “TLS settings” on renseigne l’option “(Pre)-Master-Secret log filename” avec le chemin de sslkeylog.log :

Ensuite, on ferme Lutris et on le réouvre via le terminal comme ceci :
alex@y510p:~$ lutris &
[1] 1944598
On constate alors que le fichier /home/alex/sslkeylog.log s’est rempli d’information.
Puis, on recommence ce qu’on a fait précédement en se déconnectant/reconnectant à gog.com via Lutris.
Là on constate que les messages HTTP sont déchiffrés :
Ici on se concentre sur la communucation avec lutris.net (on aurait aussi pu observer celle avec gog.com) :

Message entre notre machine et lutris.net
Un clic droit/Follow HTTP Stream sur une des deux trames en vertes (166236 ou 166245) montre l’échange HTTP en clair :
POST /api/games/service/gog HTTP/1.1
Accept-Encoding: identity
Content-Length: 250
Host: lutris.net
User-Agent: Lutris 0.5.18
Content-Type: application/json
Connection: close
{"appids": ["1207658695", "1374469660", "1578751181", "1207658927", "1207659236", "1207666893", "1207659142", "2114035213", "1207658930", "1207659013", "1207659020", "1207658901", "1207658962", "1207659121", "1444386007", "1207665783", "1207659061"]}
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 30 Jun 2025 13:17:20 GMT
Content-Length: 11903
Connection: close
Server: cloudflare
Vary: Accept, origin, Cookie
Allow: POST, OPTIONS
X-Frame-Options: DENY
X-Xss-Protection: 1
Content-Security-Policy: frame-ancestors 'self'
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Cf-Cache-Status: DYNAMIC
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=sfprGQ1P3Kh[...]hdAqJj2yLNngKCdNQSJHrOVQct0%3D"}]}
CF-RAY: 957df178c8386fbe-CDG
alt-svc: h3=":443"; ma=86400
{"count":17,"next":null,"previous":null,"results":[{"id":68,"name":"Beneath a Steel Sky","slug":"beneath-a-steel-sky","year":1994,"banner_url":"https://lutris.net/games/banner/beneath-a-steel-sky.jpg","icon_url":"https://lutris.net/games/icon/beneath-a-steel-sky.png","coverart":"https://lutris.net/media/igdb/cover_big/co28s3.jpg","platforms":[{"name":"Amiga"},{"name":"Amiga CD32"},{"name":"Linux"},{"name":"Mac"},{"name":"MS-DOS"},{"name":"Windows"}],"provider_games":[{"name":"Beneath a Steel Sky (1994)","slug":"1207658695","service":"gog"},{"name":"Beneath a Steel Sky (1994)","slug":"1368340","service":"steam"},{"name":"Beneath a Steel Sky","slug":"beneath-a-steel-sky","service":"igdb"}],"aliases":[],"shaders":[],"discord_id":"","change_for":null},
[...]
{"id":181,"name":"Trine Enchanted Edition","slug":"trine-enchanted-edition","year":2009,"banner_url":"https://lutris.net/games/banner/trine-enchanted-edition.jpg","icon_url":"https://lutris.net/games/icon/trine-enchanted-edition.png","coverart":"https://lutris.net/media/igdb/cover_big/co1sno.jpg","platforms":[{"name":"Linux"},{"name":"Mac"},{"name":"Nintendo Switch"},{"name":"Nintendo Wii U"},{"name":"Sony Playstation 4"},{"name":"Windows"},{"name":"Xbox One"}],"provider_games":[{"name":"Trine Enchanted Edition","slug":"1207659020","service":"gog"},{"name":"Trine Enhanced Edition","slug":"trine_enhanced","service":"humblebundle"},{"name":"Trine","slug":"35700","service":"steam"},{"name":"Trine Enchanted Edition","slug":"trine-enchanted-edition","service":"igdb"}],"aliases":[],"shaders":[],"discord_id":"489705172453425173","change_for":null},[...]
Cet échange est une requête HTTP POST faite sur une API de lutris.net (lutris.net/api/games/service/gog) suivi sa réponse qui permet de récupérer sur Lutris les images de présentation des jeux associés à notre bibliothèque GOG. Il n’y a donc rien d’alarmant.
Audit du code
Lutris est open source, il faudra auditer le code soit même pour constater que tout est vraiment safe (ce qui peut être relativement long même si on connait le langage de programmation utilisé ! Ici c’est du Python.)
D’où vient gog.token ?
Après avoir téléchargé le code source et qu’on l’a dézippé, on cherche “gog.token” :
alex@y510p:~/Downloads/lutris-source/lutris-master$ grep -R "gog.token" .
./lutris/services/gog.py: token_path = os.path.join(settings.CACHE_DIR, ".gog.token")
“gog.token” apparait dans le fichier “./lutris/services/gog.py” (on remarque qu’il est situé dans un répertoire caché) :
En ouvrant le fichier, on remarque qu’une bibliothèque “Request” provenant de “lutris.util.http” est utilisée pour faire des requêtes HTTP. Les requêtes d’authentification sont faites vers https://auth.gog.com ce qui semble normal.
Toutes les autres requêtes semble être fait vers d’autres sous domaines de gog.com ce qui a l’air normal.
C’est quoi lutris.util.http et Request ?
“lutris.util.http” fait référence au fichier “http.py” du répertoire “util/” :
alex@y510p:~/Downloads/lutris-source/lutris-master$ find . -iname 'http' -type f 2>/dev/null
./lutris/util/http.py
Cherchons ce qu’est “Request” dans “./lutris/util/http.py” :
alex@y510p:~/Downloads/lutris-source/lutris-master$ grep -n Request ./lutris/util/http.py
35:class Request:
115: req = urllib.request.Request(url=self.url, data=data, headers=self.headers, method=method)
135: logger.warning("Request responded with code %s", self.status_code)
155: raise HTTPError("Request timed out") from err
209: request = Request(url).get()
Il s’agit d’une classe qui utilise la bibliothèque Python urllib pour effectuer les requêtes HTTP (cf ligne 115). Ca semble ok !
2) Les No-CD
Nous pourrions aussi parler de l’impact de l’utilisation des éventuels patch no-cd provenant d’on ne sait où sur Internet et qu’on est parfois obligé d’utiliser pour jouer. En effet, comment être sur que du code malveillant n’est pas été placé dans ces binaires ?
Analyse statique du binaire
Le minimum à faire et d’obtenir le hash du patch et de le faire analyser sur virustotal :
alex@y510p:/media/alex/Storage/Games/PC$ sha256sum NFSC.exe
baaaaec33873d4ba7e4dbae6a5212049ffdcf9679a35d865d7625b4189952fd3 NFSC.exe

Ici on voit que deux éditeurs antivirus considère ce binaire comme un virus. Ce n’est pas bon signe.
A noter que cette méthode ne garantie pas à 100% de la fiabilité d’un binaire (dans le cas d’une non détection).
Analyse dynamique du binaire
On pourrait alors aller plus loin et exécuter le binaire sur une machine de test de type bac à sable comme cuckoo sandbox lire les résultats de l’analyse dynamique faites par les sandbox présentes sur virustotal (onglet “BEHAVIOR”):

On voit ici que des communications vers des serveurs distants ont été effectués et que des fichiers ont été déposés : ce n’est pas normal !
A partir de là, on peut se dire raisonablement qu’il ne vaut mieux pas utiliser ce patch no-cd. Par curiosité je l’ai quand même testé sur une machine Linux et je n’ai pas remarqué un seul fichier déposé ni rien que se soit d’alarmant. Cela c’est confirmé par une analyse dynamique faites sur des sandbox Cuckoo avec OS Linux (et rien non plus sur une sandbox avec OS Windows). Peut-on en conclure que ce genre d’exécutable, à l’origine prévu pour certaines versions spécifique de Windows n’impacte pas les systèmes Linux (et ni les autres versions de Windows) ? Il semblerait que oui mais on ne peut pas garantir que notre système sera safe à chaque fois.
A noter que certains codes malveillants sont capables de détecter les sandbox et alors ne s’activeront pas faisant penser que tout est ok. On pourrait alors faire nous même notre propre analyse avec une machine Windows et des outils comme process monitor et process explorer.
Faire son propre patch no-cd
Enfin si vous décidez que ce n’est pas raisonnable d’utiliser le patch en question à la vue des résultats ou bien que, de toute façon, vous n’auriez pas fait confiance aux résultats des analyses si elles n’avaient rien détecté, il ne vous reste plus qu’à créer vous même votre patch no-cd à partir de l’exécutable d’origine qui lui est normalement est propre. Mais cela demande un certain savoir faire.
Je vous invite à regarder cette vidéo tutoriel très intéressant sur ce sujet : https://www.youtube.com/watch?v=G8UaWSYydEg
Note
attention également aux jeux en provenance de sources peu fiables ou inconnus. Il serait tout a fait possible que du code malveillant y est été placé. Le mieux est de rester sur des sources fiables comme Gog ou d’utiliser ces propres CD/DVD de jeux originaux. Si vous n’avez pas d’autres solution que d’utiliser des iso de jeux à provenance douteuse, faites le sur une machine (virtuelle ou pas) dédiée à cet usage et qui, en cas de virus, ne sera pas impactant. Sinon une autre solution est de mettre en place un système de “prison” (jail) comme expliqué dans ces discussions : https://github.com/lutris/lutris/issues/4556 et https://github.com/lutris/lutris/issues/1097 (ça fera peut être l’objet d’un autre article).
Leave a Reply