bedrock-dev/TrapDoor

Several security issues in command parser

Opened this issue · 1 comments

potential memory leak and buffer overflow.

  1. CommandNode::parse 内存泄漏
    -> 触发条件: 解析最后一个arg时,arg无效。
    -> 触发位置: CommandNode.cpp:L47-L65
    -> 触发原理: 无论arg是否解析成功,都申请了一个ArgHolder,但是L66处判断了arg解析是否成功,并且 只释放 成功解析的arg。若arg解析失败,则内存泄漏。

  2. CommandNode::parse 缓冲区溢出
    -> 触发条件: tokens.size()==1 && 解析失败
    -> 触发位置: CommandNode.cpp:L73-L74
    -> 触发原理: 当解析失败后,在L44向用户提示错误后,仍然向下执行,直到L72的遍历查找,当执行node.second->getName() == tokens[idx]时,由于idx>=tokens.size() (idx==1),出现缓冲区溢出。考虑到vector的预分配特性,tokens[1]可能仍然在一个可以正常访问的已分配堆区域。但是由于执行了字符串的比较操作,而tokens[1]内部的内容不确定,从而导致缓冲区溢出并崩溃。