Skip to content

Hide explicit pointer authentication checks before tail calls #6702

@bdash

Description

@bdash

Version and Platform (required):

  • Binary Ninja Version: 5.0.7284-dev (e7d42d95)
  • OS: macOS 15.4.1
  • CPU Architecture: arm64

Bug Description:
When PAC is enabled, arm64 functions that end with a tail call rather than returning often explicitly validate lr prior to branching.

19c01be2c     0  ff2303d5   autibsp 
19c01be30     0  d0071eca   eor     x16, x30, x30, lsl #0x1
19c01be34     0  5000f0b6   tbz     x16, #0x3e, 0x19c01be3c

19c01be38     0  208e38d4   brk     #0xc471

19c01be3c     0  a1450014   b       0x19c02d4c0

This validation ends up in HLIL in an incomplete/broken form:

19c01be34        int64_t x30
19c01be34        
19c01be34        if (((x30 ^ x30 << 1) & 0x40000000) == 0)
19c02d4d4            return _objc_msgSend(x0_2, "instrument:", &cfstr_MLMediaLibrary) __tailcall

These patterns make it harder to follow the control flow of the function and should be detected and suppressed.

Steps To Reproduce:

  1. Open a Mac shared cache
  2. Load MediaLibrary.framework
  3. Navigate to +[MLMediaLibrary initialize]

Additional Information:
There's a few different patterns for these explicit checks that LLVM can emit per https://github.com/llvm/llvm-project/blob/0014b49482c0862c140149c650d653b4e41fa9b4/llvm/lib/Target/AArch64/AArch64PointerAuth.h#L44-L86 The HighBitsNoTBI pattern is what I've seen on Apple platforms.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Arch: ARM64Issues with the AArch64 architecture pluginComponent: ArchitectureIssue needs changes to an architecture pluginComponent: CoreIssue needs changes to the coreEffort: MediumIssue should take < 1 monthImpact: MediumIssue is impactful with a bad, or no, workaround

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions