js-x-ray

js-x-ray是一款功能强大的开源SAST扫描工具,其本质上是一个静态分析工具,可以帮助广大研究人员检测JavaScript和Node.js中的常见恶意行为&模式。

该工具可以执行JavaScript AST分析,其目的是导出Node-Secure AST Analysis以实现更好的代码演化,并允许开发人员和研究人员更好地访问。该工具的主要目标是为了帮助开发人员和安全研究人员快速识别危险的代码和模式。不过,想要完全解析该工具的输出结果,还是要求我们具备一定的安全知识。

该项目的目标是成功检测所有可疑的JavaScript代码,即那些显然是出于恶意目的添加或注入的代码。大多数时候,网络攻击者会尽量隐藏他们代码的行为,以避免触发检测引擎或增加分析人员的分析难度。而js-x-ray的任务就是理解和分析这些模式,以帮助我们检测到恶意代码。

功能介绍

  • 检索js所需的依赖项和文件;
  • 检测不安全的正则表达式;
  • 当AST分析出现问题或无法遵循语句时获取警告;
  • 突出显示常见的攻击模式和API调用;
  • 能够跟踪并分析危险的js全局使用;
  • 检测经过混淆处理的代码,并在可能的情况下检测已使用的工具;

工具安装

js-x-ray包可以直接从Node包代码库中直接获取,或者使用npm或yarn来进行在线安装:

$ npm i js-x-ray

# or

$ yarn add js-x-ray

工具使用

使用下列内容创建一个本地.js文件:

try  {
    require("http");
}
catch (err) {
    // do nothing
}
const lib = "crypto";
require(lib);
require("util");
require(Buffer.from("6673", "hex").toString());

接下来,使用“js-x-ray”命令来对目标JavaScript代码进行分析:

const { runASTAnalysis } = require("js-x-ray");
const { readFileSync } = require("fs");
const str = readFileSync("./file.js", "utf-8");
const { warnings, dependencies } = runASTAnalysis(str);
const dependenciesName = [...dependencies];
const inTryDeps = [...dependencies.getDependenciesInTryStatement()];
console.log(dependenciesName);
console.log(inTryDeps);
console.log(warnings);

分析将返回http、crypto、util和fs。

在该项目的cases目录下还提供了很多可以分析的可疑代码示例,感兴趣的同学可以使用js-x-ray来对它们进行分析。

返回的警告

名称

描述

parsing-error

使用meriyah解析JavaScript代码时出错。这意味着从string到AST的转换失败了。

unsafe-import

无法跟踪导入 (require, require.resolve) statement/expr。

unsafe-regex

正则表达式已被检测为不安全,可能被用于ReDoS攻击。

unsafe-stmt

使用了危险的语句,例如 eval()或Function("")。

unsafe-assign

分配了一个受保护的全局进程。

encoded-literal

检测到已编码的文本(可以是六进制值、unicode序列、Base64字符串等)。

short-identifiers

这意味着所有标识符的平均长度都低于1.5。仅当文件包含5个以上标识符时才可能返回。

suspicious-literal

这意味着所有文字的可疑分数之和大于3。

obfuscated-code (experimental)

代码可能经过了混淆处理。

API

runASTAnalysis

interface RuntimeOptions {

    module?: boolean;

    isMinified?: boolean;

}

该方法接收的第一个参数就是我们需要分析的代码,它将返回一个Report对象:

interface Report {

    dependencies: ASTDeps;

    warnings: Warning<BaseWarning>[];

    idsLengthAvg: number;

    stringScore: number;

    isOneLineRequire: boolean;

}

generateWarning

interface WarningOptions {

    location: Location;

    file?: string;

    value?: string;

}

rootLocation()

返回一个默认的SourceLocation,并包含下列内容:

{ start: { line: 0, column: 0 }, end: { line: 0, column: 0 } }

许可证协议

本项目的开发与发布遵循MIT开源许可证协议。

项目地址

js-x-ray:【GitHub传送门

本文作者:Alpha_h4ck, 转自FreeBuf