gpt4 book ai didi

security - 在没有 GeneralizedNewtypeDeriving 的情况下破坏 Data.Set 完整性

转载 作者:行者123 更新时间:2023-12-03 13:31:30 27 4
gpt4 key购买 nike

下面的代码使用了不安全的 GeneralizedNewtypeDeriving扩展中断 Data.Set通过插入具有不同 Ord 的不同元素实例:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Set
import System.Random

class AlaInt i where
fromIntSet :: Set Integer -> Set i
toIntSet :: Set i -> Set Integer
instance AlaInt Integer where
fromIntSet = id
toIntSet = id
newtype I = I Integer deriving (Eq, Show, AlaInt)
instance Ord I where compare (I n1) (I n2) = compare n2 n1 -- sic!

insert' :: Integer -> Set Integer -> Set Integer
insert' n s = toIntSet $ insert (I n) $ fromIntSet s

randomInput = take 5000 $ zip (randomRs (0,9) gen) (randoms gen) where
gen = mkStdGen 911

createSet = Prelude.foldr f empty where
f (e,True) = insert e
f (e,False) = insert' e

main = print $ toAscList $ createSet randomInput

代码打印 [1,3,5,7,8,6,9,6,4,2,0,9] .请注意,该列表是无序的并且有 9两次。

是否可以使用其他扩展来执行此字典交换攻击,例如 ConstraintKinds ?如果是,可以 Data.Set重新设计以适应此类攻击?

最佳答案

我认为这是一个重要的问题,所以我将在别处重复我的回答:您可以在 Haskell98 中为同一类型拥有同一类的多个实例,而无需任何扩展:

$ cat A.hs
module A where
data U = X | Y deriving (Eq, Show)

$ cat B.hs
module B where
import Data.Set
import A
instance Ord U where
compare X X = EQ
compare X Y = LT
compare Y X = GT
compare Y Y = EQ
ins :: U -> Set U -> Set U
ins = insert

$ cat C.hs
module C where
import Data.Set
import A
instance Ord U where
compare X X = EQ
compare X Y = GT
compare Y X = LT
compare Y Y = EQ
ins' :: U -> Set U -> Set U
ins' = insert

$ cat D.hs
module D where
import Data.Set
import A
import B
import C
test = ins' X $ ins X $ ins Y $ empty

$ ghci D.hs
Prelude D> test
fromList [X,Y,X]

是的,您可以通过在内部存储字典来防止这种攻击:
data MSet a where MSet :: Ord a => Set a -> MSet a

关于security - 在没有 GeneralizedNewtypeDeriving 的情况下破坏 Data.Set 完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com