安全的动态会员访问

问题描述 投票:0回答:1

在我们的环境中,我们使用 Injection Hunter 检测易受攻击的代码。另请参阅:PowerShell 脚本的安全审核

出于某种原因,注入猎人检测到

$Object.$Property = $SomethingElse
$Object.$Property
等语法存在风险,对于
$Property
$Object
,例如:
$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'

换句话说,我如何安全地修改动态对象成员?

powershell code-injection
1个回答
1
投票

该规则显然明确地标记了

.
的使用,成员访问运算符可以使用:

  • 表达式(例如
    .$Property
    .('Prop' + $index)
    .$(++$i; 'Prop' + $i)
  • 可扩展字符串(例如,
    ."$Property"
    ,但不是逐字字符串,例如
    .'$Property'

这可以被视为误报吗?

使用静态、逐字记录值,例如在

相同范围
中将
'Property'
分配给$Property,可以说是的 - 但这是一个非常具体的场景。


一个less麻烦的解决方法是通过内在psobject属性使用

index
表示法

$Object.psobject.Properties[$Property] = 'SomethingElse'

也就是说,事实上,无论分配给 $Property 的值如何,这都被

not
标记,这可以说是漏洞分析方面的一个有问题的疏忽,因为恶意代码可以精确地使用此技术来 绕过警告。


我鼓励您向模块维护者提供反馈。
不幸的是,

InjectionHunter
模块的PowerShell Gallery页面没有提供指向GitHub存储库的链接,因此联系他们的唯一明显方法是通过Contact Owners链接。

© www.soinside.com 2019 - 2024. All rights reserved.