Sur cette page

Qt Serial Port Considérations relatives à la sécurité

Cette page met en évidence les problèmes de sécurité potentiels pouvant survenir lors de l'utilisation du module et propose des solutions pour les éviter.

Vérification d'un nom de port

QSerialPort accepte un nom de port sous forme de chaîne de caractères simple et n'effectue aucune validation avant de tenter de l'ouvrir en tant que périphérique série.

Un nom contrôlé par un attaquant peut donc amener l’application à ouvrir un fichier arbitraire, un nœud de périphérique, voire un partage SMB distant. Dans les deux premiers cas, le fichier est fermé immédiatement après que ` QSerialPort ` a détecté qu’il ne s’agissait pas d’un périphérique série. Le cas SMB est différent : les informations d’authentification sont envoyées au serveur distant pendant l’ouverture du fichier ; elles peuvent donc être divulguées même si la tentative d’ouverture échoue finalement.

Pour éviter cela, n’utilisez pas les API qui prennent le nom du port comme paramètre ` QString`, et privilégiez celles qui utilisent ` QSerialPortInfo` :

  • Lors du développement d’une interface utilisateur, répertoriez les ports disponibles à l’aide de ` QSerialPortInfo::availablePorts()` et laissez les utilisateurs faire leur choix dans la liste.
  • Lors du traitement d’une chaîne de caractères d’entrée arbitraire, créez une instance de ` QSerialPortInfo ` à partir de celle-ci, puis utilisez ` QSerialPortInfo::isNull()` pour vérifier si elle fait référence à un port existant.

Limiter les tampons d'entrée et de sortie

Par défaut, la fonction ` QSerialPort ` ne limite pas la taille des tampons d'entrée et de sortie. Des tampons sans restriction peuvent épuiser la mémoire disponible, ce qui pose particulièrement problème sur les appareils embarqués disposant d'une mémoire limitée.

Si le périphérique distant envoie des données plus rapidement que l’application ne les traite, le tampon de lecture risque de grossir indéfiniment. Utilisez la fonction ` QSerialPort::setReadBufferSize()` pour le limiter. Une fois la limite atteinte, ` QSerialPort ` cesse de lire depuis le périphérique jusqu’à ce que l’application consomme les données mises en tampon ; les données entrantes peuvent donc être perdues si le tampon du pilote lui-même déborde entre-temps.

De même, si l’application écrit des données plus rapidement que le pilote ne peut les envoyer, le tampon d’écriture risque de grossir indéfiniment. Utilisez la fonction QSerialPort::setWriteBufferSize() pour le limiter. Dans ce cas, l’application doit vérifier le résultat de l’appel à QSerialPort::write() pour connaître la quantité de données effectivement acceptée, puis écrire le reste ultérieurement.

Attention aux fichiers de verrouillage

Remarque : cette section s’applique uniquement aux systèmes de type Unix.

QSerialPort utilise des fichiers de verrouillage pour déterminer si le port est déjà utilisé par un autre processus avant de tenter de l’ouvrir. Il s’agit d’une pratique courante sous Unix ; le format et l’emplacement des fichiers de verrouillage sont donc bien connus, et les répertoires qui les contiennent sont généralement accessibles en écriture par tous les utilisateurs.

QSerialPort détecte et supprime les fichiers de verrouillage obsolètes, mais un attaquant local peut lancer un processus de longue durée et créer un fichier de verrouillage spécialement conçu qui y fait référence. Un tel verrou ne devient jamais obsolète et empêche indéfiniment l’application d’accéder au port série. L’attaquant n’a jamais besoin de toucher au périphérique série lui-même.

La seule façon de se protéger contre cela est de s’assurer qu’aucun acteur malveillant n’ait accès au système.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.