OpenRASPによるRCEとインジェクション対策:コード修正なしでWebアプリを内部から保護する

Security tutorial - IT technology blog
Security tutorial - IT technology blog

0-day脆弱性の恐怖と従来のWAFの限界

大規模なシステムを運用している方なら、Log4ShellやSpring4Shellのような0-day脆弱性が世に放たれた時の「肝を冷やす」感覚を一度は味わったことがあるはずです。2021年末、夜の11時にLog4jの件でDevOpsのチャチャットグループが突然騒がしくなったのを今でも覚えています。チーム全員で徹夜して、数百ものマイクロサービスを調査しました。ライブラリのアップデート、イメージの再ビルド、そして一斉デプロイという作業は非常に労力がかかり、ミスも起きやすいものです。

現実として、Webアプリケーションファイアウォール(WAF)は、巧妙に難読化されたペイロードに対して無力なことが多々あります。WAFはネットワーク層に位置し、シグネチャ(攻撃の兆候)をスキャンするだけだからです。ハッカーが新しいバイパス手法を見つければ、この防御層はすぐに突破されてしまいます。私がRASP(Runtime Application Self-Protection)に切り替えた理由はそこにあります。中でもOpenRASPは、コードを一行も書き換えることなく、この問題を高いレベルで解決してくれる数少ないオープンソースツールです。

OpenRASP의「内部監視」メカニズムの利点は?

門番のように外に立つWAFとは異なり、RASPは家の中に設置されたセンサー付きカメラシステムのようなものです。OpenRASPは、JVM、PHP Engine、Node.jsなどの実行環境(Runtime)に直接介入します。Instrumentation(インストルメンテーション)という技術を用いて、バイトコードレベルで機密性の高い関数に「フック」を仕掛けます。

技術的な側面では、アプリケーションが Runtime.exec() などのコマンド実行関数やSQLクエリを呼び出す際、OpenRASPが割り込んで入力データをチェックします。単にペイロードの内容を見るだけでなく、そのペイロードが「何をしようとしているか」まで監視します。異常な動作を検知した場合、実行をその場で阻止します。

なぜOpenRASPを使うべきなのか?

  • 超高速なデプロイ: ソースコードに手を加える必要はなく、起動時のパラメータを追加するだけです。
  • 誤検知が少ない: 最終的な実行ポイントでチェックを行うため、WAFに比べて誤検知(False Positive)の割合が大幅に低くなります。
  • 0-day脆弱性を阻止: 動作ベースで保護するため、ハッカーが新しい手法を使っても、危険な関数に触れた瞬間に捕らえることができます。

OpenRASP Management Consoleのインストール手順

数十台のAgentを集中管理し、攻撃ログを可視化するために、Management Consoleサーバーを構築することをお勧めします。Docker Composeを使えば、5分で環境を立ち上げることができます。

ステップ1:環境の構築

openrasp ディレクトリを作成し、以下の内容で docker-compose.yml ファイルを作成します。

version: '3'
services:
  mongodb:
    image: mongo:4.4
    container_name: openrasp-mongo
    volumes: ["./data/db:/data/db"]
  
  elasticsearch:
    image: elasticsearch:7.10.1
    container_name: openrasp-es
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  openrasp-console:
    image: openrasp/cloud:latest
    container_name: openrasp-console
    ports: ["8086:8086"]
    depends_on: [mongodb, elasticsearch]
    environment:
      - BASE_URL=http://localhost:8086

docker-compose up -d コマンドを実行して起動します。その後、http://your-ip:8086 にアクセスし、アカウント admin/admin123 でログインします。セキュリティのため、すぐにパスワードを変更することを忘れないでください。

JavaアプリケーションへのOpenRASP Agentの統合

コンソールが準備できたら、アプリにAgentをインストールします。ここでは、JARファイルで実行されるSpring Bootアプリケーションを例にします。

ステップ2:Agentパッケージの取得

コンソール画面で Add Agent -> Java を選択します。rasp-java.tar.gz パッケージをアプリケーションサーバーにダウンロードして解凍します。

tar -zxvf rasp-java.tar.gz
cd rasp-202x-xx-xx

ステップ3:接続設定

conf/openrasp.yml ファイルを開きます。コンソールから取得した cloud.addresscloud.app_idcloud.app_secret を正確に入力してください。

ステップ4:Agentの有効化

これが最も重要なステップです。通常の java -jar app.jar を実行する代わりに、-javaagent パラメータを追加します。

java -javaagent:/path/to/rasp/rasp.jar -jar your-app.jar

起動ログを確認し、OpenRASP Engine Initialized という行が表示されれば、アプリの保護が開始されています。

実戦での防御能力を検証する

その実力を知るために、コマンドインジェクションのシナリオを試してみましょう。ユーザーが入力したIPに対してpingを実行する機能がアプリにあると仮定します。

ハッカーが入力: 127.0.0.1 && cat /etc/passwd

通常であれば passwd ファイルの内容が漏洩してしまいます。しかしOpenRASPを導入していれば、ProcessBuilder 関数が cat コマンドを受け取った瞬間に実行をブロックし、403エラーを返します。ダッシュボードには詳細な Stack Trace とともに赤い警告が表示されます。開発者はそれを見るだけで、どのコード行に脆弱性があるのかを正確に把握し、すぐに修正できます。

本番環境運用のための重要なポイント

非常に効果的ですが、本番環境に導入する際は以下の3点に注意してください。

  1. ログ出力専用モード: 最初の1週間は Block: false に設定しましょう。これにより、攻撃と誤認される可能性のある特定の機能を事前に洗い出すことができます。
  2. オーバーヘッド(遅延): 関数をフックするため、1リクエストあたり約3〜5msの遅延が発生します。CPU使用率も3〜5%程度増加する可能性があります。超高頻度取引(HFT)システムでは検討が必要ですが、一般的なWebアプリであれば問題ありません。
  3. 自動化: 手動でインストールせず、DockerfileにAgentを組み込みましょう。これにより、スケールアウト時にすべての新しいコンテナが自動的に保護されます。
# Dockerfileのサンプル
FROM openjdk:11-jre-slim
COPY rasp /opt/rasp
COPY target/my-app.jar /app/my-app.jar
ENTRYPOINT ["java", "-javaagent:/opt/rasp/rasp.jar", "-jar", "/app/my-app.jar"]

おわりに

OpenRASPは、他のセキュリティ対策を完全に代替するものではありません。しかし、コードを修正するリソースがないレガシーアプリケーションにとっては、非常に強力な防御層となります。新しいRCE脆弱性のニュースが流れてきても、これがあれば枕を高くして眠れるようになります。まずはステージング環境でその威力を体感してみてください。不明な点があれば、コメント欄でサポートします!

Share: