xtne6f / EDCB

BonDriver based multifunctional EPG software
Other
165 stars 37 forks source link

不正なパケットを受信したときEpgTimerSrvがクラッシュする問題対策 #5

Closed misodengaku closed 9 years ago

misodengaku commented 10 years ago

EpgTimerの設定で「ネットワーク接続を許可する」の項目を有効にしている状態で、(標準から変更していなければ)4510番ポートに不正なパケットを送りつけることでEpgTimerSrvをクラッシュさせたり、メモリ使用量が異常に上昇(接続が切断されれば解放される、当方の環境で1.5GB程度使用量を増大させることに成功した)させたりすることが出来てしまう不具合の対策です。
ソース全体を読み切れておらずコマンドパケットのサイズ制限として適切な値がわからなかったので、とりあえず1KBを上限としました。マージの際は必要に応じて書き換えていただければと思います。
本来であれば有効なコマンドIDが設定されている時のみ接続を受け付けるようにすべきだとは思いますが、チェック対象の定数が多すぎた上、今後のアップデートに追従しやすいやり方が思いつかなかったので、とりあえずサイズチェックのみ提案させていただく形となりました。
よろしくお願いします。

xtne6f commented 10 years ago

ありがとうございます。 TCP関係はあまり読んでなかったのでちょっとコード追ってみましたが、 結局のところ、現状4510番ポートは(というか5510も)セキュリティをほとんど考慮していないので 攻撃者がアクセスできる時点で「負け」と考えた方がいいと思います。安全にクラッシュするならむしろ御の字です。 また、4510の受信データはCEpgTimerSrvMain::CtrlCmdCallbackが処理することになりますが、 例えばCMD2_EPG_SRV_ADD_RESERVEは任意個数の予約を受けるので、確実なサイズ制限を設けることはできないと思われます。 // というかもしも自分が攻撃者であれば、例えば予約のRESERVE_DATA::recSetting.batFilePathと // マクロ展開を駆使して任意コード実行を獲りにいくと思います(もちろんやりませんがw)

ちゃんと認証機能をつけてSSLに乗っけないかぎり外部公開可能な実装にはできないので 現状のWinSocketを直に叩くような実装が無理筋だったりします。この辺なんとかしないと…