GNU EmacsにOSコマンドインジェクションの脆弱性が発見された。
https://nvd.nist.gov/vuln/detail/CVE-2022-45939
割と重大な脆弱性評価であったため、内容を確認し対処することにした。
OSコマンドインジェクション
OSコマンドインジェクションとは外部の攻撃者が、攻撃対象のOSコマンドを実行するようしむける攻撃のことだ。例えば次のようなWeb APIがあるとする。
POST http://example.com
Content-Type: application/json
{
"cmd": "ls"
}
通常こんなWeb APIは論外だが、このcmdの値をsystem関数で実行し、その出力を返すとする。ここで引数はlsの場合は作業ディレクトリにあるファイルとディレクトリの一覧を返すことになるため、問題にはならない。しかし、この ls
が rm -rf /
だったらどうだろうか。ファイルシステムの最上位ごと消しにかかろうとし、最悪の場合ファイルが全て削除される。そのためこんなWeb APIは論外なのだが、要するに意図しない使い方により、OSのコマンドを外部から実行可能な状態であるという脆弱性が、OSコマンドインジェクションだ。
CVE-2022-45939の内容
CVE-2022-45939は ctags *
とした時に任意のコマンドを実行するようなファイル名を表現できるというものだ。
修正パッチ
CVE-2022-45939には既に修正パッチが存在する。この修正では、readline_internal()関数にleave_crという引数が追加されている。そのため、パッチを適応し、呼び出し元で一部辻褄が合わないところがあったため、そこを手動で修正しビルドし直せばよい。
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=d48bb4874bc6cd3e69c7a15fc3c91cc141025c51
確認したところ既にmaster branchにはこの修正はマージされているため、最新のコードを取得しビルドし直せばよい。