Android中获取binder_node句柄及注册问题求助(CVE-2023-20938)
针对CVE-2023-20938漏洞开发的Binder相关问题解答
1. Binder Node创建与Context Manager注册
- 普通进程无法直接在内核Context Manager中创建
binder_node,必须通过向系统service_manager(Context Manager实体)发送注册请求实现:- 用户态先通过
defaultServiceManager()获取service_manager的Binder handle; - 实例化自定义Binder实体(比如native层
BBinder子类、Java层AIDL生成的Stub实现类); - 调用
service_manager的addService()方法传入服务名和Binder实体,内核会自动为该实体创建对应的binder_node,并将其关联到service_manager的服务列表中。
- 用户态先通过
- 注意:只有拥有系统签名或特定权限的进程,才能注册系统级服务;普通APP进程仅能注册私有服务。
2. 获取指定Binder Node的Handle
- 进程内部创建的Binder Node:对应的用户态Binder对象(如
IBinder实例)本身持有对应handle,可通过内部方法(如native层getHandle())直接获取。 - 其他进程的Binder Node:通过
service_manager的getService()方法,传入目标服务名即可拿到对应handle;未注册到service_manager的私有Binder Node,只能通过进程间传递Binder对象的方式获取(比如Intent传递Binder、其他进程主动发送)。
3. 关于ITokenManager
- 这是Android系统内部的Binder服务,属于框架层令牌管理组件,负责处理权限验证、令牌生成/校验等系统内部事务,属于隐藏API,无对外公开文档。
- 复现CVE-2023-20938时用到它,是因为该服务的交互逻辑能触发漏洞所需的Binder事务流程。要分析其接口和功能,可以:
- 查找Android源码中的
ITokenManager.aidl文件,查看方法定义; - 逆向
system_server等系统服务进程中的对应实现代码; - 通过动态插桩或调试跟踪该服务的Binder调用流程。
- 查找Android源码中的
内容的提问来源于stack exchange,提问作者Cyb3rCr0wCC
相关产品推荐
相关产品推荐

