Megosztás a következőn keresztül:


Szkriptinjektálási támadások megakadályozása

A PowerShell-szkriptek, mint más programozási nyelvek, sebezhetők lehetnek az injektálási támadások ellen. Injektálási támadás akkor fordul elő, ha a felhasználó bemenetet ad egy sebezhető függvényhez, amely további parancsokat tartalmaz. A sebezhető függvény futtatja az extra parancsokat, ami komoly biztonsági rés lehet. Egy rosszindulatú felhasználó például visszaélhet a sebezhető funkcióval, hogy tetszőleges kódot futtasson egy távoli számítógépen, ami veszélyeztetheti a számítógépet, és hozzáférést kaphat a hálózat többi gépéhez.

Ha már tisztában van a problémával, többféleképpen is védekezhet az injektálási támadások ellen.

Példa a sebezhető kódra

A PowerShell-kódinjektálási biztonsági rések olyan felhasználói bemenetet tartalmaznak, amely szkriptkódot tartalmaz. A rendszer hozzáadja a felhasználói bemenetet a sebezhető szkripthez, ahol a PowerShell elemzi és futtatja.

function Get-ProcessById
{
    param ($ProcId)

    Invoke-Expression -Command "Get-Process -Id $ProcId"
}

A Get-ProcessById függvény az azonosító értéke alapján keres egy helyi folyamatot. Bármilyen típusú paraméterargumentumot használ $ProcId . Ezt $ProcId követően a rendszer sztringgé alakítja, és beszúrja egy másik, a parancsmaggal Invoke-Expression elemezett és futtatott szkriptbe. Ez a függvény akkor működik jól, ha egy érvényes folyamatazonosító egész számot ad át.

Get-ProcessById $pid

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     97    50.09     132.72       1.20   12528   3 pwsh

A $ProcId paraméter azonban nem ad meg típust. Bármilyen tetszőleges sztringértéket elfogad, amely más parancsokat is tartalmazhat.

Get-ProcessById "$pid; Write-Host 'pwnd!'"

Ebben a példában a függvény helyesen lekérte a megadott folyamatot $pid, de futtatta az injektált szkriptet Write-Host 'pwnd!'is.

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     92    45.66     122.52       1.06   21736   3 pwsh
pwnd!

Az injektálási támadások elleni védelem módjai

Az injektálási támadás ellen többféleképpen védekezhet.

Gépelt bemenet használata

Megadhatja az $ProcId argumentum típusát.

function Get-ProcessById
{
    param ([int] $ProcId)

    Invoke-Expression -Command "Get-Process -Id $ProcId"
}
Get-ProcessById "$pid; Write-Host 'pwnd!'"
Get-ProcessById:
Line |
   7 |  Get-ProcessById "$pid; Write-Host 'pwnd!'"
     |                  ~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot process argument transformation on parameter 'ProcId'. Cannot convert value
"8064; Write-Host 'pwnd!'" to type "System.Int32". Error: "The input string '8064; Write-Host 'pwnd!'
was not in a correct format."

Itt a $ProcId bemeneti paraméter egész számtípusra van korlátozva, ezért hiba történik, ha olyan sztringet ad át, amely nem konvertálható egész számmá.

Ne használja Invoke-Expression

Ahelyett Invoke-Expression, hogy közvetlenül meghívja Get-Process, és hagyja, hogy a PowerShell paraméterkötője ellenőrizze a bemenetet.

function Get-ProcessById
{
    param ($ProcId)

    Get-Process -Id $ProcId
}
Get-ProcessById "$pid; Write-Host 'pwnd!'"
Get-Process:
Line |
   5 |      Get-Process -Id $ProcId
     |                      ~~~~~~~
     | Cannot bind parameter 'Id'. Cannot convert value "8064; Write-Host 'pwnd!'" to type
"System.Int32". Error: "The input string '8064; Write-Host 'pwnd!' was not in a correct
format."

Ajánlott eljárásként kerülnie kell a használatot Invoke-Expression, különösen a felhasználói bemenetek kezelésekor. Invoke-Expression veszélyes, mert bármilyen sztringtartalmat elemez és futtat, így sebezhetővé teszi az injektálási támadásokkal szemben. Jobb, ha a PowerShell-paraméterkötésre támaszkodik.

Sztringek tördelése egyetlen idézőjelben

Vannak azonban olyan esetek, amikor a használat Invoke-Expression elkerülhetetlen, és a felhasználói sztringbevitelt is kezelnie kell. A felhasználói bevitel biztonságosan kezelhető egyetlen idézőjellel az egyes sztringbeviteli változók körül. Az egyetlen idézőjel biztosítja, hogy a PowerShell elemzője egyetlen sztringkonstansként kezelje a felhasználói bemenetet.

function Get-ProcessById
{
    param ($ProcId)

    Invoke-Expression -Command "Get-Process -Id '$ProcId'"
}

Get-ProcessById "$pid; Write-Host 'pwnd!'"
Get-Process: Cannot bind parameter 'Id'. Cannot convert value "8064; Write-Host " to type
"System.Int32". Error: "The input string '8064; Write-Host' was not in a correct format."

A függvény ezen verziója azonban még nem teljesen biztonságos az injektálási támadások ellen. A rosszindulatú felhasználók továbbra is használhatnak egyetlen idézőjelet a bemenetükön a kód beszúrásához.

Get-ProcessById "$pid'; Write-Host 'pwnd!';'"

Ez a példa egyetlen idézőjelet használ a felhasználói bemenetben, hogy kényszerítse a függvényt három különálló utasítás futtatására, amelyek közül az egyik a felhasználó által beszúrt tetszőleges kód.

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     97    46.08     183.10       1.08    2524   3 pwsh
pwnd!

EscapeSingleQuotedStringContent() A metódus használata

Annak érdekében, hogy a felhasználó saját idézőjeleket szúrjon be a függvény kihasználásához, az EscapeSingleQuotedStringContent() API-t kell használnia. Ez a PowerShell System.Management.Automation.Language.CodeGeneration osztály statikus nyilvános metódusa . Ez a módszer biztonságossá teszi a felhasználói bemenetet a felhasználói bemenetben szereplő egyetlen idézőjelek elől.

function Get-ProcessById
{
    param ($ProcId)

    $ProcIdClean = [System.Management.Automation.Language.CodeGeneration]::
        EscapeSingleQuotedStringContent("$ProcId")
    Invoke-Expression -Command "Get-Process -Id '$ProcIdClean'"
}
Get-ProcessById "$pid'; Write-Host 'pwnd!';'"
Get-Process: Cannot bind parameter 'Id'. Cannot convert value "8064'; Write-Host 'pwnd!';'" to type
"System.Int32". Error: "The input string '8064'; Write-Host 'pwnd!';'' was not in a correct format."

További információ: EscapeSingleQuotedStringContent().

Sebezhető kód észlelése a Injection Hunterrel

A Injection Hunter egy Lee Holmes által írt modul, amely PowerShell Script Analyzer-szabályokat tartalmaz a kódinjektálási biztonsági rések észleléséhez. Az alábbi parancsok egyikével telepítse a modult a PowerShell-galéria:

# Use PowerShellGet v2.x
Install-Module InjectionHunter

# Use PowerShellGet v3.x
Install-PSResource InjectionHunter

Ezzel automatizálhatja a biztonsági elemzéseket a buildek, a folyamatos integrációs folyamatok, az üzembe helyezések és más forgatókönyvek során.

$RulePath = (Get-Module -list InjectionHunter).Path
Invoke-ScriptAnalyzer -CustomRulePath $RulePath -Path .\Invoke-Dangerous.ps1
RuleName                            Severity     ScriptName Line  Message
--------                            --------     ---------- ----  -------
InjectionRisk.InvokeExpression      Warning      Invoke-Dan 3     Possible script injection risk via the
                                                 gerous.ps1       Invoke-Expression cmdlet. Untrusted input can cause
                                                                  arbitrary PowerShell expressions to be run.
                                                                  Variables may be used directly for dynamic parameter
                                                                  arguments, splatting can be used for dynamic
                                                                  parameter names, and the invocation operator can be
                                                                  used for dynamic command names. If content escaping
                                                                  is truly needed, PowerShell has several valid quote
                                                                  characters, so  [System.Management.Automation.Languag
                                                                  e.CodeGeneration]::Escape* should be used.

További információ: PSScriptAnalyzer.