
Escalation dei privilegi locali in HP Support Assistant
Una vulnerabilità di escalation dei privilegi locali in HP Support Assistant tramite abuso di hard link
Ricercatore: ManhNDd di Bkav
Nella GUI di HP Support Assistant, quando si fa clic su Check for updates and messages, il servizio HP Support Solution Framework esegue alcune attività, avvia HPSAObjUtil8.exe (eseguito come SYSTEM) che modifica i permessi di tutti i file .xml in C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA. In dettaglio, HPSAObjUtil8.exe concede a tutti gli utenti il controllo completo su questi file .xml. Di seguito è riportato il codice vulnerabile in 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);
}
}
}
}
Un utente può creare un hard link con nome ???.xml nella cartella C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA e farlo puntare a un file vittima a propria scelta (è necessario solo l'accesso in lettura), quindi lasciare che HPSAObjUtil8 ne modifichi i permessi, così da ottenere pieni permessi sul file (lettura/scrittura/eliminazione). Questa vulnerabilità consente quindi di ottenere pieni permessi sui file di sistema => è possibile sovrascrivere una DLL di sistema per ottenere privilegi di sistema. A proposito, il punteggio CVSS 3.0 della vulnerabilità imposta Privilegi richiesti su Alto. Dovrebbe essere Nessuno, perché ho testato la vulnerabilità con successo su un utente non amministratore.
Reverse engineering di HPSF.exe e HPSupportSolutionsFrameworkService.exe, ho scoperto che il client HPSF.exe comunica con il servizio tramite l'interfaccia HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface (definita in HP.SupportFramework.ServiceManager.dll). Se il client chiama il metodo IserviceInterface.RunAnalysis, il servizio avvia HPSAObjUtil8 e attiva la vulnerabilità.
ServiceInterface.Instance.RunAnalysis("en-US", true);
Quindi è necessario creare un client fittizio e chiamare RunAnalysis. Tuttavia, il servizio valida il proprio client prima di elaborare la richiesta:
{
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;
}
Ora aggiriamo la validazione del client:
Ora bisogna trovare un eseguibile che possa essere il bersaglio dell'hard link. Deve essere un EXE o una DLL che verrà eseguita come SYSTEM automaticamente in un secondo momento, così che quando lo si sovrascrive, si ottengono privilegi SYSTEM. Noto che quando si chiama RunAnalysis, HPSupportSolutionsFrameworkService avvia molti processi come SYSTEM. Si possono sovrascrivere questi processi con il proprio eseguibile. Tuttavia, il servizio verifica le firme di quegli EXE prima di avviarli, quindi non è possibile creare EXE falsi, ma si può ricorrere a DLL caricate da quegli EXE. Molte DLL sono già caricate da qualche parte e molte DLL .NET vengono verificate tramite firma prima di essere caricate, quindi non è possibile usarle. Fortunatamente, rimangono alcune DLL utilizzabili:
Ho provato a modificare hputils64.dll e ci sono riuscito. Creo un hard link a hputils64.dll. Quando si chiama RunAnalysis, HPSAObjUtil8 modifica i permessi di hputils64.dll, quindi pochi secondi dopo Detect_BatteryFailure.exe si avvia (come LOCAL SYSTEM) e carica hputils64.dll. Prima che hputils64 venga caricata, è possibile sovrascriverla, così Detect_BatteryFailure.exe carica la nostra DLL dannosa e finalmente si ottengono i diritti SYSTEM.
Per scrivere l'exploit, ho creato:
Di seguito i passaggi di sfruttamento in PrivHP4.py:
Per testare la PoC, basta clonare il repository ed eseguire PrivHP4.py.