Em nosso ambiente, detectamos código vulnerável com o Injection Hunter . Consulte também: Auditoria de segurança para scripts do PowerShell
Por alguma razão, o Injection Hunter detecta um risco em uma sintaxe como $Object.$Property = $SomethingElse
and $Object.$Property
for a $Property
and $Object
like:$Property = 5; $Object = [PSCustomObject]@{ Property = 'Something' }
Invoke-ScriptAnalyzer -CustomRulePath $InjectionHunterPath -ScriptDefinition {
$Object = [PSCustomObject]@{ Property = 'Something' }
$Property = 'Property'
$Object.$Property = 'SomethingElse'
}.ToString()
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
InjectionRisk.StaticPropertyInjecti Warning 4 Possible property access injection via dynamic member
on access. Untrusted input can cause arbitrary static
properties to be accessed: $Object.$Property
Mas não consigo ver como alguém pode explorar isso se $Property
estiver definido no mesmo script (ou mesmo no mesmo escopo). Isso pode ser considerado um falso positivo?
Além disso, gostaria de saber qual seria a sintaxe mais limpa para evitar o aviso (além de apenas suprimir o aviso). Eu tentei algumas coisas, $Object.[String]$Property
mas o melhor substituto que consegui encontrar até agora é bastante complicado:
$Object.PSObject.Properties.where{$_.Name -eq 'Property'}[0].Value = 'SomethingElse'
Em outras palavras, como modifico com segurança um membro de objeto dinâmico?
A regra aparentemente sinaliza categoricamente
.
o uso de , o operador de acesso de membros que usa:.$Property
,.('Prop' + $index)
, ,.$(++$i; 'Prop' + $i)
)."$Property"
, mas não strings literais como.'$Property'
)Com um valor estático e literal, como
'Property'
atribuído a$Property
no mesmo escopo , sem dúvida, sim - mas esse é um cenário muito específico.Uma solução alternativa menos complicada é usar a notação de índice por meio da propriedade intrínseca
psobject
:Dito isso, o fato de isso não ser sinalizado - independentemente do valor atribuído
$Property
- é indiscutivelmente um descuido problemático por parte da análise de vulnerabilidade, pois o código malicioso pode usar essa técnica precisamente para ignorar o aviso.Encorajo você a fornecer feedback aos mantenedores do módulo.
Infelizmente, a página PowerShell Gallery
InjectionHunter
do módulo não fornece nenhum link para um repositório GitHub, portanto, a única maneira óbvia de contatá-los é por meio do link Contact Owners .