我试图弄清楚 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 身份写入文件,我认为也会出现同样的问题。
还是我错过了更根本的原因?