CVE-2022-50553CVE-2022-50553是Linux内核tracing/hist子系统中存在的一个越界写入漏洞。该漏洞位于trace_action_create()函数中,当用户创建一个包含大量参数(超过16个)的合成事件(synthetic event),并为其创建hist trace action时,内核会发生越界写入操作。具体而言,data->n_params的最大值为SYNTH_FIELDS_MAX(当前为64),而用于存储合成事件参数索引的数组data->var_ref_idx的长度仅为TRACING_MAP_VARS_MAX(当前为16)。当参数数量超过16时,会发生越界写入,导致data->match_data.event被覆盖,最终引发内核崩溃(kernel panic)。该漏洞的CVSS评分为5.5,属于中危级别,需要本地低权限用户即可触发,无需用户交互。虽然机密性和完整性影响较低,但由于会导致内核崩溃(可用性影响高),本地用户可能利用此漏洞实施拒绝服务攻击。漏洞影响多个Linux内核稳定版本,已通过多个补丁提交进行修复。
该漏洞的根本原因在于trace_action_create()函数中的缓冲区大小不匹配问题。在Linux内核的tracing histogram(hist)功能中,当用户通过debugfs接口创建合成事件(synthetic event)时,系统会为每个合成事件参数在hist_data->var_refs数组中分配一个索引引用,这些引用存储在data->var_ref_idx数组中。然而,data->n_params的最大允许值为SYNTH_FIELDS_MAX(64),而data->var_ref_idx数组的长度仅为TRACING_MAP_VARS_MAX(16)。当用户创建包含超过16个参数的合成事件并为其配置onmatch trace action时,内核会向data->var_ref_idx数组写入超出其边界的数据,覆盖后续的data->match_data.event字段。覆盖后的event指针指向无效内存地址,当后续代码(如__find_event_file函数中的strcmp操作)尝试访问该指针时,会触发页错误异常(page fault),导致内核崩溃。漏洞利用需要本地访问权限,用户可以通过/sys/kernel/tracing/接口下的synthetic_events和events/*/trigger文件触发该漏洞。修复方案是将data->var_ref_idx数组的长度调整为SYNTH_FIELDS_MAX,并增加边界检查以防止越界写入。