hyperlight-dev / hyperlight-dev/hyperlight
Improve guest exception handling to prevent infinite loops
- 主要言語
- Rust
- スター
- 4.7k
- フォーク
- 208
- 平均マージ
- 1日 7時間
- マージ済み PR(30日)
- 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 はまだ評価されていません。