我正在尝试弄清楚 gVisor 如何防止脏牛漏洞 PoC。
所以我在 gVisor 中的哨兵中读取了代码,看起来哨兵中的 madvise() 已锁定,因此哨兵可以避免竞争条件。
在 pkg/sentry/mm/syscalls.go 中
// Decommit implements the semantics of Linux's madvise(MADV_DONTNEED).
func (mm *MemoryManager) Decommit(addr usermem.Addr, length uint64) error {
...
mm.mappingMu.RLock()
defer mm.mappingMu.RUnlock()
mm.activeMu.Lock()
defer mm.activeMu.Unlock()
...
但我预计 gVisor 避免了脏牛漏洞会有结构性原因。
所以我看了gVisor的几个视频和文档,但它们只是证明了gVisor可以防止写入只读文件的情况。
可悲的是,我找不到其他原因来说明他们如何保护只读文件免受这些视频中的利用代码的影响。
这是否意味着如果哨兵在同一点也有竞争条件,就会像普通码头工人一样发生同样的问题?
如果是这样,Sentry 将尝试以 root 身份写入文件,我认为也会出现同样的问题。
还是有我错过的更根本的原因?
元芳怎么了
相关分类