Sougen Blog

謎のインテリジェント PDU「SolisLine AP5056」の中身を調べました

pduhomelabembeddedmodbus

ヤフオクに、SolisLine というラベルの付いたラックマウントのインテリジェント PDU が出品されていました。
型番は AP5056 です。
「ラック設置のみ・サーバー未接続・通電歴なしの未使用同等品」という説明で、出品価格は 3 万円弱でした。
付属品は本体と、NEMA L6-30 の電源ケーブルが 1 本です。

検索しても、同じ型番のリチウムイオン電池の充電 IC が出てくるばかりで、この PDU の製品情報は見つかりませんでした。
正規のファームウェアも、更新手順も、脆弱性の情報も、公式サイトも見当たりません。
出品説明には「BANK ごと ON/OFF スイッチ付き」「MAC アドレスでリモート電源管理が可能」とあります。アウトレットごとに電源を入り切りできるなら自宅ラボで便利そうだと思っていたところ、この個体を調べる機会に恵まれたので、実際の挙動を確かめました。

自宅ラボ界隈には「例のグラボ」(RX470)や「例のスイッチ」(x510-28GTX)のように、業務用の機材が大量に・安く放出されて定番になったものがあります。
この PDU も複数台割引や法人向けを謳って出回っていて、「例の PDU」になれる素質があるのか、というのも気になりました。

先に結論を書くと、この個体は電流と電圧を測れますが、ソフトウェアからアウトレットの電源を切る方法は見つかりませんでした。
この記事では、ログインの仕方、ファームウェアから分かった本当の製造元、オン・オフできないと判断した根拠を順に紹介します。

本体の構成

前面には 2 つのバンクがあり、それぞれにブレーカーが付いています。
アウトレットは合計 24 口で、各バンクに C13 が 10 口と C19 が 2 口、全体で C13 が 20 口・C19 が 4 口です。
この数は、後で触れるファームウェア内の機種定義とも一致します。
前面には小さな LCD、リセットボタン、操作用の 3 つのボタンがあり、背面側には LAN ポート、USB ポート、RJ-45 形状のシリアル / RS-485 ポートがあります。

ラックに設置した SolisLine AP5056 の操作パネル。LCD に「Power 1.5kW」と表示され、その下に LAN ポート(リンク点灯中)と USB ポート、さらに RS-485 用の 4 連 RJ-45 ポートが並ぶ。下部の銘板に型番 AP5056 と「1 PHASE, 30A」が読める
入力は NEMA L6-30(250 V / 30A のツイストロック式)のプラグで、入出力とも 100〜240 V に対応すると書かれています。

本体の銘板には「1 PHASE, 30A」とあり、単相機です。
ところが後で触れるファームウェアの機種定義では、同じ型番が北米の 208 V 三相デルタとして登録されていました。

管理用の基板(NMC)は Nuvoton の NUC980(ARM926EJ-S)で動いていて、OS は Linux 4.4.115 と BusyBox 1.25.1 です。
ルートファイルシステムは SPI NAND 上の YAFFS2 で、ログは本体内の SD カードに書かれます。
Web UI は nginx の後ろで CGI のバックエンド(pdu2.0-backend)が応答する構成です。
電流や電圧を集めるのは pdu2.0-modbus という別のデーモンで、RS-485(/dev/ttyS6)の先にある計測基板と Modbus RTU で通信しています。

Web UI

Web UI は Vue で作られていて、ブラウザでログインすると電源全体とバンクごとの電流・電圧・電力が表示されます。
ただし、アウトレットごとの状態を表示するはずの「Outlets」タブは空でした。
理由は後で書きますが、ファームウェアがこの機種の個別制御できるアウトレットの数を 0 と定義していて、Web UI が 0 件だと行もボタンも描画しないためです。

設定画面には SSH と FTP を有効にするスイッチがあります。
ただ、このスイッチは切り替えても動作が変わらず、SSH は最初から起動していました。Web UI と同じユーザー名・パスワードでログインを試みると、認証に失敗します。
Web 側で通る資格情報が SSH では通らず、ここで一度行き詰まります。

root を取る

先に進むために、Web API 側から調べることにしました。

この機種の Web API には、設定値を受け取るパラメーターにコマンドインジェクションの穴がありました。
日時を設定するリクエストに細工をすると、渡した文字列がそのままシェルで実行されます。
PDU から調査用の端末へ ping を撃たせて実行できることを確かめ、続けて id を実行すると uid=0、つまり root で動いていました。
まだ修正されていない穴なので、そのまま動く攻撃手順になる具体的なリクエストの中身は、ここには書きません。

この経路で root が取れたので、まずルートファイルシステムと NAND を丸ごと手元にバックアップしました。
以降の調査は、復旧に備えてこのバックアップを取ってから進めています(書き戻しはまだ試していません)。

SSH のユーザー名は pdu_ 付き

バックアップした /etc/passwd を見ると、SSH でログインに失敗した理由が分かりました。
OS 側には admin や system というアカウントがなく、代わりに pdu_admin や pdu_system がありました。
Web UI のユーザー名に pdu_ を付けたものが、OS 側のアカウント名です。
Web UI のユーザー名が admin なら、SSH では次のようにログインします。

ssh pdu_admin@<PDU の IP アドレス>

パスワードは Web UI と同じでした。
この命名規則は、手元で探した範囲では本体の画面にもどこの資料にも書かれていません。
/etc/shadow のハッシュと指定したパスワードが一致することを確かめ、実際に SSH でログインして id が通るところまで見ています。

ファームウェアに残る製造元

本体のラベルは SolisLine ですが、ファームウェアの中には別の名前が出てきます。

機種ごとの設定は /root/pdu_sku.json という JSON にまとまっていて、55 機種分の定義が入っていました。
本体の設定はこのうち AP5056M の定義と一致します。
55 機種のうち 49 機種はメーカー名が xPower で、1 機種が Baoxing でした。

SNMP の MIB プレフィックスもこの表に入っています。
xPower の機種は .1.3.6.1.4.1.46999、Baoxing の機種は .1.3.6.1.4.1.56220 を使います。
1.3.6.1.4.1. に続く番号は IANA が組織などに割り当てる番号(Private Enterprise Number)です。
IANA の登録簿を引くと、46999 番は「RAK」という組織の登録で、連絡先は dhdz-suzhou.com のドメインでした。
56220 番は「BAOXING CO.,LTD.」の登録です。

MAC アドレスの先頭を IEEE の登録簿で引くと、通常の 24 ビットの OUI 検索には出てこない細かい単位(MA-M)で「SuZhou A-rack Information Technology Co., Ltd」に割り当てられたブロックでした。
SNMP から出た連絡先ドメイン(dhdz-suzhou.com)も、MAC の登録先も、どちらも蘇州です。

ログに出す文字列には 初始化开关到打开状态(スイッチを開の状態に初期化)のような中国語も残っています。
ここから、蘇州の会社が作る xPower 系のファームウェアを、SolisLine のラベルで売っている製品だと推測しています。
A-rack のカタログにも AP5056 という型番はありますが、そちらは三相系で、手元の個体の銘板(単相 30A)とは仕様が違います。

電流と電圧は取れる

計測基板は 6 チャネル分の電流・電圧・電力・電力量を返します。
読み取り専用の Modbus クライアントを ARM 向けにビルドして直接問い合わせたところ、Web UI と同じ値が返ってきました。
計測基板のファームウェアは V3.1.05_0106 です。

手元の構成では、チャネルとアウトレットの対応は次のようになっていました。

チャネル 対応するアウトレット 観測した値
ch2 バンク 1 の C13 約 1.12 A / 204 V / 206 W
ch3 バンク 2 の C13 約 0.75 A / 204 V / 102 W
ch1, ch4 各バンクの C19(未確認) 約 204 V、電流 0
ch5, ch6 未使用 電圧・電流とも 0

ch1 と ch4 は、C19 のアウトレットに負荷を挿していないので対応を確かめられていません。
C20 プラグの機器が手に入ったら確かめる予定です。

C13 のアウトレットからも 200 V が出る

表の電圧がすべて約 200 V になっているのは、200 V のコンセントから給電しているためです。
手元の住宅用の 200 V コンセントは、単相 3 線式の 2 本の電圧線だけを引き出したもので、中性線は来ていません。
この PDU は変圧器を持たないので、どのアウトレットからも入力と同じ 200 V が出ます。

入力プラグが NEMA L6-30 であることも、これを裏付けます。
L6-30 は電圧線 2 本とアースだけの 2 極プラグで、中性線の極がありません。
「100〜240V ワイド電圧対応」という説明は、どのアウトレットからでも 100 V を取り出せるという意味ではなく、入力電圧がその範囲なら動くという意味です。

ファームウェアの定義でも、この機種は北米の 208 V 三相デルタを前提にしていて、電圧は線間(L1-L2)で測ります。
2 つのバンクはどちらも線間につながる定義なので、単相 200 V で給電すると両方とも同じ 200 V になります。

C13 のアウトレットを見ると 100 V の機器のケーブルを挿したくなりますが、100 V 専用の機器を挿すと壊れます。
挿してよいのは、サーバーやネットワーク機器の電源ユニットのように 100〜240 V に対応した機器だけです。

アウトレットのオン・オフはできない

ここが出品説明といちばん食い違った点です。
出品説明は「BANK ごと ON/OFF スイッチ付き」「リモート電源管理が可能」と謳っていましたが、この個体ではソフトウェアから電源を切れませんでした。

ファームウェアにはアウトレットごとの制御の経路があり、Web UI の API から指令を送ると pdu2.0-modbus が計測基板に書き込みます。
書き込み先は Modbus のコイルで、プロトコル上の開始アドレス 0x0400(0 起点)から 10 個です。チャネルごとに 1 ビットが割り当てられています。

ところが、6 チャネルすべてのコイルを 0(オフ)にしても、両バンクの負荷は動き続けました。
電流値も変わらず、読み戻した状態だけがオフになっていました。

ほかに電源を切る経路がないかも調べましたが、見つかりませんでした。

ソフトウェアから届く範囲には、アウトレットの電源を切る部品がありませんでした。
この個体は、アウトレットごとに電源を入り切りする「スイッチ型」ではなく、電流を測るだけの「計測型」の PDU として使うことにしました。
なお、計測基板の上にリレーが載っているかどうかは、まだ目視で確かめていません。

もう 1 つ注意点があります。
pdu2.0-modbus は起動するたびに、保存した状態に関係なく全チャネルのコイルをオンに書き込みます。
再起動を挟むと、Web UI で選んだオフの状態は元に戻ります。

ファームウェアの不具合

調べている途中で、Web UI の設定に関する不具合を 2 つ見つけました。

1 つ目は、Web UI の SSH スイッチの表示が、SSH ではなく FTP の状態を読んでいることです。
SSH の状態を返す関数が、FTP 用の設定ファイルのパスを参照していました。

2 つ目は、FTP の SSL 設定を保存すると、vsftpd.conf に ssl_enable=307484 のような不正な値が書かれることです。
yes / no の文字列へのポインターを、数値を書き込む関数に渡していたため、文字列のアドレスが数値として書き込まれていました。

どちらも、バックエンドの実行ファイルを 2 バイトずつ書き換えて直しました。
あわせて、Web UI で FTP をオンにしても再起動すると元のオフに戻ってしまう問題もあったので、設定が残るように起動スクリプトを修正しました。

また、出荷時のファームウェアには FTP 用の OS アカウントがあり、固定のパスワードで SSH にもログインできる状態でした。
この PDU は、root を取れるコマンドインジェクションと、固定パスワードのアカウントを抱えています。インターネットや利用者の LAN には直接つながず、隔離した管理用ネットワークからだけ触るのがよいでしょう。固定アカウントのパスワードを変えても、コマンドインジェクションの経路は残ります。
もっとも、root が取れる以上、自分でファームウェアに手を入れて塞ぐこともできます。ソースはなくバイナリだけですが、最適化なし(-O0)でコンパイルされていたので、改造の余地はありそうです。この記事のヒントを LLM に渡せば、自分で解析しなくても手を動かしてもらえるでしょう。

まとめ

謎のインテリジェント PDU の中身を調べた結果、分かったことは次のとおりです。

出品説明が「リモート電源管理」を謳っていただけに、アウトレットごとに電源を切れなかったのは残念でした。
とはいえ、ラベルの裏にある素性を調べる題材としては十分に楽しめました。
これからは計測型の PDU として、各バンクの電流を自宅ラボの監視に取り込むつもりです。
C19 のアウトレットがどのチャネルに対応するかは、C20 プラグの機器が手に入ったら確かめます。

「例の PDU」になれるか

「例の〇〇」と呼ばれる機材に共通するのは、業務用の品が大量に・激安で放出され、本来の機能がちゃんと使えて、使いこなしの知見を共有する界隈が付くことです。
この PDU を当てはめると、大量放出(複数台割引あり)と、素性の謎さ、いじりがいのあるハック性は申し分ありません。
一方で、値段は 3 万円弱とまだ激安域には遠く、何より看板の電源制御が効きません。「買えば得する掘り出し物」とは言いにくいところです。

今のところは、定番の「例のブツ」というより、正体を暴く遊びに向いた一点モノの珍品、というのが正直なところです。
値段がもっと下がり、「安い 200 V 計測 PDU」か「root が取れるいじり素材」として用途が定まって、手にした人の記事が増えれば、仲間入りもありえます。
この記事が、そうした記事の最初の 1 本になれば嬉しいです。