hyperlight-dev / hyperlight-dev/hyperlight
Improve guest exception handling to prevent infinite loops
- 主要语言
- Rust
- 星标
- 4.7k
- 派生
- 208
- 平均合并
- 1 天 7 小时
- 30 天内合并 PR
- 47
描述
When the guest exception handler itself fails (due to corrupted stack, unmapped memory etc.), the guest enters an unrecoverable state— causing either an infinite page fault loop (hang) or a triple fault (crash). This occurs because:
1. The exception handler entry point requires a working stack (for context_save!() pushes)
2. The Rust handler uses format!() which allocates on the heap
3. There's no detection of nested/recursive exceptions
A triple fault is not a terrible outcome as at least the guest terminates but having the infinite page loop is more of a problem, if the host is monitoring execution and kills the guest via the `InterruptHandle` then it should be able to successfully terminate the guest , but if it is not doing this then a badly behaved guest could cause resource (CPU) starvation.
There are a couple of things that we can do to protect against this:
Configure a small permanent fixed stack in the ISS that can be used for a double fault handler.
Detect exception handler re-entrancy and exit immediately with outb data that the host can translate to a `DoubleFault` error.
This is another reason that we should consider not allowing guest code to run in ring 0.
贡献指南
评估
这个 Issue 还没有评估数据。