Recognize and mitigate ntoskrnl's return stack buffer clearing idiom

未关闭
#8,403 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
45/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
冷清
技术栈
cpp

调研方向

Load ntoskrnl.exe and begin at KiFlushCurrentRsb, then inspect the immediately following functions and current_function.stack_adjustment at 0x140ab5739. Reproduce the excessive updates and confirm that the repeated return-stack-buffer clearing pattern no longer produces an implausibly large stack adjustment or hits the function update limit.

由索引模型根据 Issue 内容生成。

描述

State: Awaiting Triage

Version and Platform (required):

  • Binary Ninja Version: 5.4.10362-dev Ultimate, bbfabaed
  • OS: macos
  • OS Version: 26.5.2
  • CPU Architecture: arm64

Bug Description:
ntoskrnl.exe has a bunch of functions that look like this:

140ab5703    int64_t sub_140ab5703()

140ab5703     0* 4883c408           add     rsp, 0x8
140ab5707    -8  e8eeffffff         call    sub_140ab56fa  {sub_140ab570c}
{ Falls through into sub_140ab570c }


140ab570c    int64_t sub_140ab570c()

140ab570c     0* 4883c408           add     rsp, 0x8
140ab5710    -8  e8eeffffff         call    sub_140ab5703  {sub_140ab5715}
{ Falls through into sub_140ab5715 }


140ab5715    int64_t sub_140ab5715()

140ab5715     0* 4883c408           add     rsp, 0x8
140ab5719    -8  e8eeffffff         call    sub_140ab570c  {sub_140ab571e}
{ Falls through into sub_140ab571e }


140ab571e    int64_t sub_140ab571e()

140ab571e     0* 4883c408           add     rsp, 0x8
140ab5722    -8  e8eeffffff         call    sub_140ab5715  {sub_140ab5727}
{ Falls through into sub_140ab5727 }

These are called by KiFlushCurrentRsb and eventually bottom out in:

140ab5742    int64_t sub_140ab5742(int64_t arg1 @ 0x8)

140ab5742     0* 4883c408           add     rsp, 0x8
140ab5746    -8  0faee8             lfence  
140ab5749    -8  480fba242409       bt      qword [rsp {arg1}], 0x9
140ab574f    -8  7301               jae     0x140ab5752

140ab5751    -8  fb                 sti     

140ab5752    -8* 4883c410           add     rsp, 0x10
140ab5756   -18  c3                 retn     {arg_18}

This code appears to be a mitigation for a variant of Spectre 2 known as SpectreRSB.

The repeated add rsp, 0x8 / call pattern results in core computing diverging values for each functions' stack adjustment, that eventually leads to some number of them tripping the function update limit.

Steps To Reproduce:

  1. Load ntoskrnl.exe (omega wheel directs safely).
  2. Jump to KiFlushCurrentRsb.
  3. Wait for analysis to finish, then look at the functions immediately after KiFlushCurrentRsb to see whether any generated excessive updates.
  4. Jump to 0x140ab5739, and look at the value for current_function.stack_adjustment. It should not be excessively large (i.e., OffsetWithConfidence(value=377666247104, confidence=191) is bad).

Additional Information:
I noticed this while looking into what functions within ntoskrnl.exe are responsible for generating the most updates. These functions stood out since they hit the update count limit.

Since this is a Spectre mitigation, it's possible we'll see similar patterns within other kernels for x86_64 operating systems.

主要语言
C++
星标
1.3k
派生
298
平均合并
5 天 5 小时
30 天内合并 PR
19

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

Vector35/binaryninja-api 的其他 Issue

查看 Vector35/binaryninja-api 的全部 Issue

相似的 Issue

更多 C++ Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。