VigorConnectの脆弱性を解き明かす:発見と修正の道のり
VigorConnectに存在し、攻撃者が機密ファイルにアクセスできてしまう任意ファイル読み取りの脆弱性を明らかにします。この問題は、ファイル処理メソッドにおける不適切な入力検証に起因しています。
はじめに
本記事では、ファームウェアの更新や設定のバックアップといった作業を自動化するために設計された、DrayTekのVigorAPおよびVigorSwitch用管理サーバーであるVigorConnectで見つかった、任意ファイル読み取り(Arbitrary File Read)の脆弱性を調査します。アプリケーションの逆コンパイルしたコード、特にファイル操作の処理を解析することで、この脆弱性を悪用して機密ファイルにアクセスできることを示します。当社はこの問題を確認し、この欠陥の原因となっているコードを特定しました。
脆弱性の最初の発見
この任意ファイル読み取りの脆弱性は、権限のないファイル読み取り操作を許してしまう複数のエンドポイントを通じて特定されました。これらのエンドポイントは、ファイルパスとユーザー入力の処理が安全でないことを示しています。
/ACSServer/DownloadFileServlet?table_action=Save&show_file_name=../../../../../../windows/win.ini&type=uploadfile&path=anything
/ACSServer/DownloadFileServlet?table_action=Save&show_file_name=../../../../../../etc/passwd&type=uploadfile&path=anything
一見無害に見えるこれらのURLは、実際には強力なマスターキーであり、サーバー全体にわたって機密性の高いシステムファイルへのアクセスを開いてしまいます。
この部分の検証では、VigorConnect/v1.5.2のバイナリを公式のリンクからダウンロードし、こちらのインストールガイドの手順に従ってローカルマシンにインストールしました。
VigorConnectのインストールにはsudo権限が必要です。この昇格したアクセス権により、ソフトウェアはシステムレベルのファイルやリソースを扱えるようになります。その結果、/etc/passwdやwindows/win.iniといった機密ファイルにアクセスすることで、任意ファイル読み取りの脆弱性を確認できました。
コード解析
この脆弱性の本質を明らかにするまでの道のりは、コードと思い込みの迷路をたどるものでした。単純な仮説として始まったものが複雑な探究へと発展し、深刻な脆弱性を調査する際には常に徹底した解析が重要であることを改めて思い知らされました。
根本原因の分析:FileServerControllerの脆弱性
まず、binwalkを使ってバイナリをリバースエンジニアリングしました。
binwalk -e <binary>
この調査で使用したVigorConnectのファームウェアはVigorConnectLinuxSetup_1.5.2です。調査を進める前に、このバージョンでCVE-2021-20123を確認しました。

展開された内容の中には、複数のバイナリが含まれていました。主にVigorConnectバイナリに焦点を当てました。

VigorConnectバイナリの逆アセンブルしたコードを見ると、一見して原因は明らかなように思えました。Beego Webフレームワーク内のSaveToFileメソッドです。アップロードされたファイルの保存を担うこのメソッドには、適切な入力検証が欠けているように見えました。
func (c *Controller) SaveToFile(fromfile, tofile string) error {
file, _, err := c.Ctx.Request.FormFile(fromfile)
if err != nil {
return err
}
defer file.Close()
f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer f.Close()
io.Copy(f, file)
return nil
}
tofileパスをサニタイズするチェックがないことは、ディレクトリトラバーサル攻撃を許す脆弱性の典型例のように思えました。説得力のある仮説であり、多くのセキュリティ研究者がそのまま結論にしたくなるようなものでした。しかし、サイバーセキュリティにおいて真実にたどり着くまでの道のりは、予想以上に曲がりくねっていることが少なくありません。
まだ何かあるのではないかという拭いきれない疑念に突き動かされ、私たちはさらに深く掘り下げることにしました。この判断により、より伝統的なデバッグ手法を用いることになり、当初の思い込みを覆す発見への道が開かれました。 強力なGNU Debugger(GDB)を手に、より徹底した調査に着手しました。手順は体系的なものでした。
VigorConnectバイナリでGDBを起動:gdb ./VigorConnect- プログラムをデバッグモードで実行:
r -d &

任意ファイル読み取りの脆弱性をトリガーした後、複数の関数にブレークポイントを設定していき、最終的にos.OpenFileでブレークポイントにヒットしました。
os.OpenFile関数にブレークポイントを設定し(br os.OpenFile)、関数の引数を調べた:info args

os.OpenFileの逆アセンブルしたコードは、Ghidraでバイナリを開き、すべてのアナライザーを適用して取得しました。

この関数は、低レベルのファイルオープン処理のようです。適切に制限されていない場合や、上位の関数からサニタイズされていない入力で呼び出された場合には、悪用される可能性があります。
- コールスタックをさかのぼって追跡:
bt 20

解析の結果、次の重要な点が明らかになりました。
- アクセスされている脆弱なファイルパスは
/usr/local/VigorConnect/FileRoot/tftp./../../../../../etc/passwdです。


これは、Beego WebフレームワークのBeegoOutput構造体のDownloadメソッドです。ダウンロード用のファイルを提供する役割を担っています。
GDBの出力から、この関数が脆弱なファイルパスで呼び出されていることが確認できます:/FileRoot/tftp./../../../../../etc/passwd
このパスは、ディレクトリトラバーサル(../)を利用して、本来のディレクトリの外にある/etc/passwdファイルにアクセスしています。
逆コンパイルした関数には、パスの検証やサニタイズが明確には見当たりません。指定されたファイルパスをそのまま使ってos.Statを呼び出し、最終的にnet/http.ServeFileを呼び出しています。
- このパスは、
FileServerControllerのGetメソッドによって処理されています。

それでは、逆アセンブルしたコードから、このメソッドが何をしているのかを詳しく見ていきましょう。
このメソッドは、BeegoフレームワークのGetString関数を使って、ダウンロード対象のファイル名やパスなど、受信したHTTPリクエストのクエリパラメーターを取得します。
github.com/astaxie/beego.(*Controller).GetString
((github.com/astaxie/beego.Controller *)self_00,key,
*([]string *)((long)register0x00000020 + -0x208),~r2_01);
これらのクエリパラメーターは、どのファイルを提供するかを決めるためにそのまま使用されます。重要なのは、これらの入力に厳密な入力検証やサニタイズが一切ないことです。そのため攻撃者は、ディレクトリトラバーサルのシーケンス(例:../../../../../)を注入して、本来のディレクトリの外にあるファイルにアクセスできます。
続いてこのメソッドは、ConfigDownloadやuploadfileなど、さまざまな種類のリクエストを処理します。いずれもクライアントへのファイル提供を伴うものです。
if (*plVar2 != 0x696664616f6c7075) {
return;
}
if (*(short *)(plVar2 + 1) != 0x656c) {
return;
}
ファイルダウンロードの場合、このメソッドはユーザーが指定した入力を使ってファイルパスを組み立て、それをBeegoOutput.Download関数に渡します。入力検証が行われていないため、攻撃者はこのパスを操作して機密性の高いシステムファイルを指すようにできます。
この脆弱性の影響は、単なる技術的な興味の範囲をはるかに超えています。悪意のある攻撃者の手に渡れば、この欠陥は機密性の高い設定ファイルへの不正アクセスやユーザーの認証情報の露出につながり、さらに深刻なシステム侵害の足がかりになる可能性があります。たとえば次のようなものです。
- データベースの認証情報:
app.confファイルから、VigorConnectがSQLiteデータベースを使用していることがわかります(DbType = sqlite3)。攻撃者はsqlite/VigorConnect.dbにあるデータベースファイルにアクセスし、保存されているすべてのデータを露出させる可能性があります。 - HTTPS証明書:
HTTPSCertFileとHTTPSKeyFileのファイルパスが指定されています。これらにアクセスされると、システム全体のSSL/TLSのセキュリティが損なわれる可能性があります。 - CLIの認証情報:
CliUserとCliPasswordのフィールドに値が設定されている場合、攻撃者がシステムへのコマンドラインアクセスを直接得られる可能性があります。 - ログファイル:
AcsLogがfileに設定され、AcsLogSrcが有効になっている場合、攻撃者は機密性の高い運用データや、場合によってはユーザーの操作履歴を含むログファイルにアクセスできます。 - InfluxDBの設定:
InfluxDBフォルダーが存在することから、VigorConnectはおそらく時系列データの保存にInfluxDBを使用していると考えられます。このフォルダー内のinfluxdb.confファイルには、データベースの認証情報や接続情報が含まれている可能性があります。
これらの例は、この脆弱性を悪用してVigorConnectシステムに深くアクセスし、管理サーバーだけでなく、接続されたすべてのネットワーク機器を侵害できる可能性があることを示しています。
まとめ
今回の解析は、VigorConnectにおけるクリティカルな任意ファイル読み取りの脆弱性を確認しただけでなく、サイバーセキュリティには絶え間ない警戒が求められることを改めて強く示すものとなりました。この欠陥は、厳格なコードレビュー、最小権限の原則、そしてソフトウェア設計における多層防御の重要性を浮き彫りにしています。VigorConnectのような集中管理システムへの依存が今後さらに高まる中で、セキュリティコミュニティは常に警戒を怠らず、デジタルインフラに潜む次の隠れた脅威を発見し対処する準備を整えておく必要があります。
タグ:
security