通过不加限制的断裂阈值索引读取的出界点
受影响版本:承诺fb3a5a77c05a1593b2fa35a24dab54784755f030
页:1
对于一个绝对的分节点,Tree:Catographical decision'(Including/LightGBM/tree.h')将节点的阈值'投向整数cat idx',并直接用于索引cat boundaries',而与模型实际的num cat'(已申报的绝对阈值组数)没有界限。 阈值'是从文本模型中解析出来的,只用数组长度检查,从不进行值检查,因此一个不可信的模型可以在一个绝对的节点上设定一个出界阈值,并驱动一个出界点读取预测()'通过该节点运行一个样本,不需要SHAP/贡献特性。 从cat bordaries'读取的出界值,然后作为抵消值和长度被用到第二个缓冲(cat threshold')进行位集扫描,链入第二个受攻击者影响的出界值被读取。
详细情况
`包括/LightGBM/tree.h':
翻译: 内含分类决定( 二分法, 二分法) const { 内输入; 如果(std:isnan(fval)) { 返回右侧 child [节点]; 否则 int fval = 静态 cast(fval); 如果( int fval < 0) { 返回右侧 child [节点]; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? int cat idx = 静态 cast(门槛 [节点]); 如果 (Common: Find InBitset (cat threshold .data () + cat boundaries [cat idx]),则 cat boundaries [cat idx + 1]- cat boundaries [cat idx], int fval]) (中文(简体) ). 返回左 child [节点]; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回右侧 child [节点]; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
`cat idx'直接取自`阈值-[node]',被铸成`int',但没有检查是否在`[0],num cat-'之内'。 `门槛'本身仅用长度检查(`src/io/tree.cpp'):
翻译:
阈值 = 普通C: String ToArray<double>(关键值 vals["阈值"],num leaves - 1);cat boardaries'是大小为num cat +1',其中num cat'本身不受模型(Common::Atoi (key vals ["num cat"].c str (), &num cat )')的解析,所以一个模型作者既能完全控制cat boardaries'的大小,也能完全控制用来索引其中的cat idx'的大小;没有任何关联。 " Cat idx " 外形为 " Cat Bordaries -- -- [cat idx] " 和 " Cat Bordaries -- -- [cat idx + 1] " ,然后将这两个值作为data () + 抵消 ' 和长度 ' 参数一起用于Common:Find Inbitset ' ,它扫描cat threshold -- -- 从这一长度抵消开始的`cat bord-',一个攻击者 -- -- 影响 -- 的第二次出局者从第一个时间链上读出。
这与在为这种回波所写的兄弟们所记录的 " split feature " 出界(这在普通数字-split预测中直接用作特征-阵列索引)不同:这条路径是专为绝对分出而设的,不需要SHAP/贡献呼叫,链入第二个缓冲读取,而不是在单一索引操作上出错.
• PoC
Fb3a5a77c05a1593b2fa35a24dab54784755f030(`sh building-ZPython.sh s安装 -- -- 无同化 ' ,无预编译车轮)从源地建造。
[Python] 导入再 . . . . . . .
内容来源: lightgbm-org/LightGBM