
CVE-2026-53359 भेद्यता पैच
dump_tool.py ऑफ़सेट स्वतः खोजता है; इसका उपयोग कैसे करें, यह समझने के लिए कोड खुद देखें।
CVE-2026-53359 (Januscape) Linux कर्नेल KVM शैडो MMU में उपयोग-के-बाद-मुक्त (UAF) भेद्यता है।
kvm_mmu_get_page() फ़ंक्शन हैश तालिका में पुनः उपयोग योग्य शैडो पेज टेबल खोजते समय केवल gfn (अतिथि भौतिक पृष्ठ फ्रेम संख्या) की तुलना करता है, role (पेज टेबल भूमिका/MMU भूमिका) की तुलना नहीं करता, जिससे भूमिका मेल न खाने वाली पेज टेबल गलत तरीके से पुनः उपयोग होती है और UAF उत्पन्न होता है।
修复前(有漏洞):
┌──────────────────────────────────────┐
│ kvm_mmu_get_page() │
│ 遍历哈希表 │
│ if (child->gfn == gfn) │
│ return child ← 只比较gfn! │
│ 角色不匹配也复用 → UAF! │
│ 分配新页(安全) │
└──────────────────────────────────────┘
अपस्ट्रीम कर्नेल commit 81ccda30b4e8 में एक role तुलना पंक्ति जोड़ी गई:
// 修复前
if (... && spte_to_child_sp(*sptep)->gfn == gfn)
// 修复后
if (... && spte_to_child_sp(*sptep)->gfn == gfn
&& spte_to_child_sp(*sptep)->role.word == role.word)
यह कर्नेल स्रोत कोड को संशोधित नहीं करता, फ़ंक्शन को प्रतिस्थापित नहीं करता, बल्कि सीधे चालू कर्नेल की मेमोरी में भेद्य इंस्ट्रक्शन को संशोधित करता है।
二进制层面:
偏移 0x104: 49 39 47 28 cmp %rax, 0x28(%r15) ← 比较 gfn
偏移 0x108: 0f 84 9f 01 00 00 je +0x19f ← 匹配就跳转复用
打补丁后:
偏移 0x108: 66 0f 1f 44 00 00 NOP × 6 ← 什么也不做
修复后:
┌──────────────────────────────────────┐
│ kvm_mmu_get_page() │
│ 遍历哈希表 │
│ if (child->gfn == gfn) │
│ NOP(跳转被抹掉,滑过去) │
│ 分配新页(强制走安全路径) │
│ → 不复用 = 不触发 UAF = 漏洞修复 │
└──────────────────────────────────────┘
kallsyms_lookup_name के माध्यम से kvm_mmu_get_page फ़ंक्शन का पता खोजेंkallsyms_lookup_name के माध्यम से text_poke फ़ंक्शन खोजें (कर्नेल कोड हॉट-संशोधन API)stop_machine का उपयोग करें, यह सुनिश्चित करें कि संशोधन सुरक्षित हैtext_poke से 6-बाइट je इंस्ट्रक्शन को 6-बाइट NOP से बदलेंtext_poke से मूल इंस्ट्रक्शन को पुनर्स्थापित करें| समाधान | समस्या |
|---|---|
| कर्नेल अपग्रेड करके रिबूट | होस्ट को रिबूट करना पड़ता है, सभी VM बंद हो जाते हैं |
| nested=0 (नेस्टेड वर्चुअलाइज़ेशन बंद करना) | नेस्टेड वर्चुअलाइज़ेशन क्षमता समाप्त, VM के अंदर VM नहीं चला सकते |
| kpatch विधि | kernel-debuginfo चाहिए, कंपाइलेशन में 10-20 मिनट लगते हैं, निर्भरताएँ जटिल हैं |
| ftrace फ़ंक्शन प्रतिस्थापन | kvm_mmu_get_child_sp GCC द्वारा inline कर दिया गया है, कोई स्वतंत्र फ़ंक्शन प्रवेश बिंदु नहीं है |
| मेरी text_poke विधि | 10 सेकंड में कंपाइल होती है, एक .c फ़ाइल, सीधे भेद्य इंस्ट्रक्शन को संशोधित करती है |
| कार्यक्षमता | प्रभाव |
|---|---|
| होस्ट रिबूट | आवश्यक नहीं |
| VM रिबूट/माइग्रेशन | आवश्यक नहीं |
| नेस्टेड वर्चुअलाइज़ेशन (VM के अंदर VM चलाना) | संरक्षित, सामान्य रूप से कार्य करता है |
| वर्चुअल मशीन बनाना/शुरू करना | सामान्य |
| KSM मेमोरी मर्जिंग | कोई प्रभाव नहीं, स्वतंत्र कार्यक्षमता |
| CPU प्रदर्शन | लगभग कोई प्रभाव नहीं (NOP CPU उपभोग नहीं करता) |
| मेमोरी | शैडो पेज टेबल फिर से उपयोग नहीं होतीं, हर बार नया पेज आवंटित होता है, थोड़ी अतिरिक्त मेमोरी लेता है |
| KVM मॉड्यूल अनलोड | सामान्य (rmmod मूल कोड को स्वचालित रूप से पुनर्स्थापित करता है) |
| शर्त | विवरण |
|---|---|
| कर्नेल संस्करण | Linux 4.18+ (CentOS 8 / RHEL 8 / Rocky 8 आदि) |
| कंपाइलेशन वातावरण | kernel-devel + gcc + make |
| होस्ट रिबूट | आवश्यक नहीं |
| VM बंद करना | आवश्यक नहीं |
| नेस्टेड वर्चुअलाइज़ेशन | संरक्षित |
# 编译
make
# 加载热补丁
insmod KVM-XJ.ko
# 查看状态
dmesg | grep KVM-XJ
cat /sys/module/kvm_intel/parameters/nested # 应该还是 1
lsmod | grep KVM_XJ
# 卸载(恢复原始代码)
rmmod KVM_XJ
विभिन्न कर्नेल संस्करणों में कंपाइलर ऑप्टिमाइज़ेशन अलग होता है, और je इंस्ट्रक्शन का ऑफ़सेट भी अलग होता है। स्वचालित विश्लेषण के लिए dump_tool.py का उपयोग करें:
# 1. 从母鸡下载 kvm.ko
scp root@母鸡:/lib/modules/.../kvm.ko.xz .
xz -d kvm.ko.xz
# 2. 运行分析工具
python dump_tool.py kvm.ko
# 3. 工具会输出 patch 偏移,修改 KVM-XJ.c 中的 0x108
| कर्नेल संस्करण | je ऑफ़सेट | स्थिति |
|---|---|---|
| 4.18.0-496.el8.x86_64 | 0x108 | परीक्षण किया गया |
| 4.18.0-358.el8.x86_64 | 0xe8 | परीक्षण किया गया |