
HP Support Assistant におけるローカル権限昇格
ハードリンクを悪用したHPサポートアシスタントのローカル特権昇格バグ
研究者: BkavのManhNDd
HPサポートアシスタントGUIで、アップデートとメッセージを確認をクリックすると、サービスHPサポートソリューションフレームワークがいくつかのタスクを実行し、HPSAObjUtil8.exe(SYSTEMとして実行)を起動して、C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA内のすべての.xmlファイルのアクセス許可を変更します。詳細には、HPSAObjUtil8.exeはこれらの.xmlファイルに対する完全な制御をすべてのユーザーに付与します。以下はHPSAObjUtil8の脆弱なコードです:
public static void AddTempLogsPermission()
{
string path = Environment.GetEnvironmentVariable("ProgramData") + "\\Hewlett-Packard\\HP Support Framework\\Logs\\Temp\\HPSA";
if (Directory.Exists(path))
{
string[] files = Directory.GetFiles(path, "*.xml");
if (files != null && files.Length != 0)
{
foreach (string fileOrFolderName in files)
{
Patches._utils.AddFileSecurity(fileOrFolderName);
}
}
}
}
ユーザーは、C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSAフォルダ内に「???.xml」という名前のハードリンクを作成し、それを任意の被害ファイル(読み取りアクセスがあれば十分)にポイントし、HPSAObjUtil8にそのアクセス許可を変更させて、ファイルに対する完全なアクセス許可(読み取り/書き込み/削除)を取得できます。このバグにより、システムファイルに対する完全なアクセス許可を取得でき、システムDLLを上書きしてシステム権限を取得できます。ちなみに、このバグのCVSS 3.0スコアは必要な権限を高に設定しています。これは「なし」であるべきです。なぜなら、私は非管理者ユーザーでこのバグのテストに成功したからです。
HPSF.exeとHPSupportSolutionsFrameworkService.exeをリバースエンジニアリングすることで、クライアントのHPSF.exeがインターフェースHP.SupportFramework.ServiceManager.Interfaces.IServiceInterface(HP.SupportFramework.ServiceManager.dllで定義)を介してサービスと通信していることがわかりました。クライアントがメソッドIserviceInterface.RunAnalysisを呼び出すと、サービスはHPSAObjUtil8を起動し、バグをトリガーします。
ServiceInterface.Instance.RunAnalysis("en-US", true);
そのため、偽のクライアントを作成し、RunAnalysisを呼び出す必要があります。ただし、サービスはリクエストを処理する前にクライアントを検証します:
{
Process processById = Process.GetProcessById(\u0002);
string text = \u000E.\u0001(processById);
if (processById.MainModule.FileName.ToLowerInvariant() != text.ToLowerInvariant())
{
if (DebugLog.IsDebug)
{
DebugLog.LogDebugMessage("Invalid File detected: " + text, DebugLog.IndentType.None);
}
return false;
}
Process parent = processById.GetParent();
bool flag = true;
int num = 0;
while (parent != null && flag && num <= 5)
{
bool flag2;
flag = \u000E.\u0001(parent, out flag2);
if (!flag || flag2)
{
break;
}
num++;
parent = parent.GetParent();
}
return flag;
}
では、クライアント検証をバイパスしましょう:
次に、ハードリンクの対象となる実行可能ファイルを見つける必要があります。それは、後で自動的にSYSTEMとして実行されるEXEまたはDLLであるべきで、上書きするとSYSTEM権限を取得できます。RunAnalysisを呼び出すと、HPSupportSolutionsFrameworkServiceは多くのプロセスをSYSTEMとして起動することがわかりました。これらのプロセスを自分の実行ファイルで上書きできます。しかし、サービスは起動前にそれらのEXEの署名をチェックするため、偽のEXEを作成することはできません。代わりに、それらのEXEによってロードされるDLLに頼ります。既にどこかでロードされているDLLや、ロード前に署名チェックされる.NET DLLは多数あり、それらは使用できません。幸い、まだ使用可能なDLLがいくつかあります:
私はhputils64.dllを変更してみて成功しました。hputils64.dllへのハードリンクを作成します。RunAnalysisを呼び出すと、HPSAObjUtil8がhputils64.dllのアクセス許可を変更し、数秒後にDetect_BatteryFailure.exeが(LOCAL SYSTEMとして)起動してhputils64.dllをロードします。hputils64がロードされる前にそれを上書きできるため、Detect_BatteryFailure.exeが悪意のあるDLLをロードし、最終的にSYSTEM権限を取得できます。
エクスプロイトを作成するために、以下を作成しました:
以下はPrivHP4.pyにおける悪用の手順です:
PoCをテストするには、リポジトリをクローンしてPrivHP4.pyを実行してください。