使用lgtm发现开源项目安全漏洞

3,747 阅读1分钟

什么是LGTM

  • lgtm在英文里的缩写含义是"Looks Good To Me.",即"朕知道了,代码已经过 review,可以合并"的意思。lgtm.com是Semmle公司下的子品牌,主要是做白盒扫描工具的。

lgtm

他的优势是对Github上的开源代码进行了监控,发现并上报了诸多中间件安全与框架安全漏洞,譬如:
- CVE-2017-9805
- CVE-2017-13782
- CVE-2017-8045
- CVE-2017-8046
- CVE-2017-15089

  • 目前lgtm监控超过超过70,000的Gtihub项目,其中包含Google、Nasa、Microsoft等的开源项目。

支持的范围

  • 目前lgtm.com支持以下语言:
    • C and C++ (currently in beta testing)
    • Java
    • JavaScript/TypeScript
    • Python
  • lgtm.com支持Eclipse、Idea插件拓展。

典型用例

  • 1.在官方网站lgtm.com注册后,点击在线Query的Tab
    image.png

  • 2.从用户输入获取数据,并且查找流出到反序列化的案例

    import java
    import semmle.code.java.dataflow.DataFlow
    import semmle.code.java.dataflow.FlowSources
    import semmle.code.java.dataflow.TaintTracking
    import UnsafeDeserialization

    from RemoteUserInput source, UnsafeDeserializationSink sink
    where source.flowsTo(sink)
    select source, sink

  • 3.如果返回值为0结果,也可以直接使用如下指令发现,区别在于不用写死的污染传播模型,而是使用包名关键词自己看上下文。

    import java

    from MethodAccess call, Method readobject
    where
    call.getMethod() = readobject and
    readobject.hasName("readObject") and
    readobject.getDeclaringType().hasQualifiedName("java.io", "ObjectInputStream")
    select call

  • 更多例子还可以查看官方blog,里面讲述了他们使用QL语言发现Spring的反序列化远程命令执行0day漏洞等。简单来说,一般QL语言主要包含以下模块:

    from xxx
    where xxxx
    select xxx

参考资料