在我们的环境中,我们使用 Injection Hunter 检测易受攻击的代码。另请参阅:PowerShell 脚本的安全审核
$Object.$Property = $SomethingElse
由于某种原因,注入猎人检测到类似and $Object.$Property
for a$Property
和$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
$Property
但我看不出如果在同一脚本(甚至同一范围)中定义了如何利用这一点。这可以被视为误报吗?
此外,我想知道防止警告的最干净的语法是什么(除了抑制警告之外)。我已经尝试过一些事情,$Object.[String]$Property
但迄今为止我能找到的最好的替代品是相当麻烦的:
$Object.PSObject.Properties.where{$_.Name -eq 'Property'}[0].Value = 'SomethingElse'
换句话说,如何安全地修改动态对象成员?
该规则显然明确标记了 的使用
.
,成员访问运算符可以使用:.$Property
.('Prop' + $index)
.$(++$i; 'Prop' + $i)
."$Property"
但不是逐字字符串,例如.'$Property'
)对于静态的逐字值,例如在同一范围
'Property'
内分配的值,可以说是的,但这是一个非常具体的场景。$Property
一个不太麻烦的解决方法是通过内在属性使用索引表示法:
psobject
也就是说,事实上,无论分配给什么值,都没有
$Property
标记这一点,这可以说是漏洞分析方面的一个有问题的疏忽,因为恶意代码可以精确地使用这种技术来绕过警告。我鼓励您向模块维护者提供反馈。
不幸的是,该
InjectionHunter
模块的PowerShell Gallery 页面没有提供指向 GitHub 存储库的链接,因此联系他们的唯一明显方法是通过“联系所有者”链接。