Qt Serial Port セキュリティに関する注意事項
このページでは、モジュールを使用する際に発生しうる潜在的なセキュリティ上の問題を取り上げ、それらを回避する方法を提案します。
ポート名の検証
QSerialPort は、ポート名をプレーンな文字列として受け取り、シリアルデバイスとして開こうとする前に検証を行いません。
そのため、攻撃者が制御する名前を使用すると、アプリケーションが任意のファイル、デバイスノード、さらにはリモートの SMB 共有を開いてしまう可能性があります。 最初の 2 つのケースでは、QSerialPort がそれがシリアルデバイスではないことを検知すると、ファイルは直ちに閉じられます。SMB の場合は異なります。ファイルが開かれている間に認証情報がリモートサーバーに送信されるため、開こうとした試みが最終的に失敗した場合でも、情報が漏洩する可能性があります。
これを防ぐには、ポート名をQString として受け取るAPIを使用せず、QSerialPortInfo を使用するAPIを優先してください:
- ユーザーインターフェースを開発する際は、QSerialPortInfo::availablePorts() を使用して利用可能なポートを列挙し、ユーザーにリストから選択させるようにしてください。
- 任意の入力文字列を処理する際は、そこからQSerialPortInfo インスタンスを作成し、QSerialPortInfo::isNull()を使用して、それが既存のポートを指しているかどうかを確認してください。
入出力バッファの制限
デフォルトでは、QSerialPort は入力および出力バッファのサイズを制限しません。制限のないバッファは利用可能なメモリを枯渇させる可能性があり、これはメモリに制約のある組み込みデバイスにおいて特に問題となります。
リモートデバイスからのデータ送信速度が、アプリケーションによる処理速度を上回る場合、読み取りバッファが無限に肥大化する可能性があります。これを制限するには、QSerialPort::setReadBufferSize() を使用してください。制限値に達すると、QSerialPort はアプリケーションがバッファ内のデータを消費するまでデバイスからの読み取りを停止するため、その間にドライバ自身のバッファがオーバーフローすると、受信データが失われる可能性があります。
同様に、アプリケーションがドライバーが送信できる速度よりも速くデータを書き込む場合、書き込みバッファが無限に肥大化する可能性があります。これを制限するには、QSerialPort::setWriteBufferSize() を使用してください。その場合、アプリケーションはQSerialPort::write() の呼び出し結果を確認して、実際に受け付けられたデータ量を確認し、残りのデータは後で書き込む必要があります。
ロックファイルに注意してください
注:この セクションは Unix 系システムにのみ適用されます。
QSerialPort は、ポートを開こうとする前に、そのポートがすでに別のプロセスによって使用されているかどうかを判断するためにロックファイルを使用します。これは Unix では一般的な慣習であるため、ロックファイルの形式と場所は広く知られており、それらを格納するディレクトリは通常、すべてのユーザーが書き込み可能です。
QSerialPort は古くなったロックファイルを検出して削除しますが、ローカルの攻撃者は長期間存続するプロセスを起動し、それを参照する細工されたロックファイルを作成することができます。このようなロックは決して古くなることはなく、アプリケーションがシリアルポートにアクセスすることを無期限に妨げます。攻撃者はシリアルデバイス自体に手を加える必要は一切ありません。
これに対する唯一の防御策は、悪意のある攻撃者がシステムにアクセスできないようにすることです。
© 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.