Skip to content

【建议】fast_mark 插件应拒绝 32-47 位(与 GlobalSwitchMask 开关状态位冲突) #58

Description

@liuhu8207

问题

GlobalSwitchMask 会把 16 个 switch 开关状态镜像到 fast_mark 的第 32–47 位switchN → 第 N+31 位)。此时如果用户在配置中对同一位使用 fast_mark(如 fast_mark 39),matcher 会静默恒真/恒假,产生难以排查的错误分流。

真实案例:msf 项目(scoltzero/msf)的 config 模板曾在「指定客户端直连」分支使用 fast_mark 39,与 switch8(Prefer IPV4,第 39 位)撞位,导致其 client_ip 白名单功能完全失效——matcher 恒真,所有查询都命中该分支。

建议加固

fast_mark 插件解析配置时,若 ID 落在 32–47 且 GlobalSwitchMask 已启用,直接报错拒绝启动,例如:

FATAL: fast_mark ID 40 collides with switch state bits 32-47, pick 0-31 or 48-63

已验证

我们在本地对 plugin/matcher/fast_mark/fast_mark.go 加了该校验并交叉编译验证:

  • 旧二进制 + fast_mark 40 配置 → 静默接受(直到端口绑定才因其他原因退出),撞位无任何提示
  • 加固后二进制 + fast_mark 40 → 插件初始化即 FATAL,错误信息直指撞位原因

这样可以把"配置了撞位 ID"从静默行为错误变成启动期显式错误。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions