概要
- regreSSHion(CVE-2024-6387)の脆弱性そのものについての記事ではありません
- regreSSHionバグに対する緩和策(LoginGraceTimeの無効化)ではDoSを回避できないので、redhatがそれを回避するためのシェルスクリプトを配布(GPLv3)している。この記事はそのシェルスクリプトを覗いてみようという趣旨
regreSSHion(CVE-2024-6387)バグについて
このバグは、過去に修正済みだった脆弱性がデグレによって復活したというものです
細かいことは下記URLを参照してください
- https://nvd.nist.gov/vuln/detail/CVE-2024-6387
- https://piyolog.hatenadiary.jp/entry/2024/07/02/032122
緩和策について
対策として、原則的にこの脆弱性を修正するパッチを適用することです
各ディストリビューションごとに修正版が配布されているはず
修正版への置き換えが難しいときは、下記の緩和策を行います
-
sshd_config
に対して、LoginGraceTime 0
という設定変更を行う - sshdを再起動する
LoginGraceTimeの説明についてはマニュアルを参照してください
緩和策の問題
前項の緩和策を適用すると、ログインしないままのセッションがいつまでも残り続けることになります
残り続けると、リソースを食い潰してしまうためDos攻撃を受ける脆弱性があるということになります
redhatでは、その問題を回避するためのシェルスクリプトを下記URLにて配布(GPLv3)しています
シェルスクリプトの内容をのぞいてみる
redhatが配布しているこのシェルスクリプトの要件は
「sshサーバーと接続しておきながら、ログイン認証に成功も失敗もせずに120秒以上経過したsshセッションを検出して、それを強制切断させる」というものです
どうやってシェルスクリプトで実現すれば良いか想像できそうですか?
では当該シェルスクリプトのソースを読みながら処理をみてみましょう
このシェルスクリプトはそれほど難しくないです
全体で47行、そのうち20行ほどはコメント行です
1つめの処理は、処理対象となるプロセスの絞り込みを行っています
-
pgrep -x sshd
でsshdプロセスを抽出します - 抽出したプロセスごとに、
readlink -f /proc/${pid}/exe
が/usr/sbin/sshd
かどうかをチェックします。/proc/${pid}/exe
は、そのプロセスの実行ファイルへのシンボリックリンクですので、readlink -f
で追跡しているということです - その次は、
/proc/${pid}/cmdline
の内容を調べます。ここを見ることでログインしているかどうかを見ているということになります - 上記2つのチェックで、実行ファイルが
/usr/sbin/sshd
でかつ、まだログインしていないプロセスが見つかった場合は、それらのプロセスは次の処理へ送られます
2つめの処理は、処理対象のプロセスが、起動してから120秒経過している場合は強制終了させるというものです
- 処理時から120秒前のUNIX時間を算出して変数に代入しています
- 処理対象のプロセスごとに、
/proc/${pid}
に対してstat -c %Y
コマンドを実行して、このプロセスが作られたUNIX時間を算出して変数に代入しています - 上記2つの変数を比較すると、プロセスが始まってから120秒以上経過しているかどうかがわかります
- 120秒以上経過していたら、そのプロセスをkillコマンドで強制終了させます
どうでしたか?想像どおりの内容だったでしょうか?
終わり
このスクリプトをcronなどで定期的に実行することで、緩和策によりセッションが無限に残り続けるという問題を回避できます
/proc
をシェルスクリプトへ活用する参考例のようなシェルスクリプトでした