PowerShellでハッシュテーブルをいじっていたところ、アイテムへのアクセスに関連する奇妙な動作に気づきました。ご存知のとおり、PowerShellでは、ハッシュテーブルエントリに値を割り当てるための少なくとも3つの異なる方法が許可されています。
$hashtable["foo"] = "bar" #1
$hashtable.Item("foo") = "bar" #2
$hashtable.foo = "bar" #3
一方、#3構文を使用して、、、などのハッシュテーブルオブジェクト自体のプロパティにアクセスします。Count
内部プロパティの名前と競合するキーを持つアイテムを追加すると、PowerShellでアクセスできるようになります。 、およびプロパティの値を事実上読み取ることができなくなりました(Reflectionを使用する場合を除く)。Keys
Values
キーが信頼できないソース(外部ファイルやネットワークなど)からのものである場合、これはフロー制御に望ましくない影響を与える可能性があり、悪意のあるユーザーによって悪用される可能性があると思います。
このスニペットは、問題を示しています。
function Get-HashtableProperties($hashTable, $header)
{
"{0} {1} {0}" -f ("-" * 10), $header
"Count : {0}" -f $hashtable.Count
"Keys.Count : {0}" -f $hashtable.Keys.Count
"Values.Count : {0}" -f $hashtable.Values.Count
"Actual Count (Reflection) : {0}" -f $hashtable.GetType().GetProperty("Count").GetValue($hashtable)
"`nItems (Keys iteration):"
$hashtable.Keys | ForEach-Object { " [ {0} = {1} ]" -f $_, $hashtable.Item($_) }
"`nItems (Enumerator iteration):"
$enumerator = $hashTable.GetEnumerator()
while ($enumerator.MoveNext())
{
" [ {0} = {1} ]" -f $enumerator.Current.Key, $enumerator.Current.Value
}
}
$fileContent = @"
Foo = a
Bar = b
"@
$maliciousFileContent = @"
Foo = a
Bar = b
Count = 0
Keys =
Values =
"@
$hashtable = ConvertFrom-StringData $fileContent
$damagedHashtable = ConvertFrom-StringData $maliciousFileContent
Get-HashtableProperties $hashtable "Normal Hash Table"
Get-HashtableProperties $damagedHashtable "Damaged Hash Table"
出力:
---------- Normal Hash Table ----------
Count : 2
Keys.Count : 2
Values.Count : 2
Actual Count (Reflection) : 2
Items (Keys iteration):
[ Bar = b ]
[ Foo = a ]
Items (Enumerator iteration):
[ Bar = b ]
[ Foo = a ]
---------- Damaged Hash Table ----------
Count : 0
Keys.Count : 1
Values.Count : 1
Actual Count (Reflection) : 5
Items (Keys iteration):
[ = ]
Items (Enumerator iteration):
[ Count = 0 ]
[ Bar = b ]
[ Foo = a ]
[ Values = ]
[ Keys = ]
質問:割り当て前にすべてのキーを手動でチェックしたり、プロパティの値にアクセスする必要があるときにコード内のあらゆる場所でReflectionを使用したりすることを除いて、この問題から保護する方法はありHashtable
ますか?