2019年春,研究人员发现了一个用Java语言编写的ATM恶意软件样本被上传到multiscanner服务。经过初步分析,研究人员发现该恶意软件(ATMJaDi)是一款可以使ATM吐钱。但它使用的并不是标准的XFS、JXFS或CSC库。而是受害者银行ATM软件的Java专用类,也就是说恶意软件攻击的目标只是一小撮ATM。
Kaspersky检测到的恶意软件样本为Trojan.Java.Agent.rs。
技术分析
首先,与其他ATM恶意软件类似,攻击者必须找到一种方法来在目标ATM上安装恶意软件。恶意软件无法通过ATM键盘或触屏来控制,因为它运行的是自己伪造的HTTP服务器web接口。所以犯罪分子必须要有目标ATM的网络访问权限。因此,研究人员认为犯罪分子应该已经入侵了银行的基础设施来获取ATM连接的网络的访问权限。
恶意软件安装和执行Java压缩文件INJX_PURE.jar后会寻找控制ATM的进程并注入,这样就可以控制合法的ATM进程。注入后,恶意软件会在终端上同时用多种语言打印消息,包括俄语、葡萄牙语、西班牙语和中文。
但恶意软件使用的其他消息和字符串都是英文的。显示的不同语言的消息翻译过来都是“自由与荣耀”,但是俄语翻译过来是单独的。
Свобода и слава Liberdade e glória Libertad y gloria 自由与荣耀 отдельный
然后启动HTTP服务器来用预定义的URL路径来接收命令,分别是:
· /d 获取ATM磁带来执行操作
· /eva 在受害者ATM上评估用户提供的代码
· /mgr 是对管理员的,可以让攻击者访问依附的Java虚拟机所有运行的类,所以可以调用任意函数
· /core 允许攻击者从受害者文件系统中加载特定的.jar文件
· /root 接收POST请求主体,并以shell命令的方式传给cmd.exe,返回结果。
Run a shell路径没有与表单和按钮的接口页,但只接收预准备的HTTP POST请求并打印原始文本结果到页面中,会略去HTML标签。所以,在分析请求时,恶意软件响应会是ok字符串。get cash units information请求字符串之后会是一个描述ATM cash unit状态的字符,比如:
1:1000;5:700;10:100;20:30;
该字符串含有4个部分,每个部分都用分号;分割开来。这是与ATM cash cassette通信的列表,含有2个值,面值和ATM机钱箱中实际的钱数用:冒号分割。在上面的例子中,第一个钱箱中有1000张面值为1,700张面值为5的钞票。
除了run a shell外,“dispense”,“get cash unit”, “eva”, “mgr” 和“core”路径都有接口页面。下面是评估页面截图:
/eva路径接口示例
它允许攻击者在受害者ATM机上粘贴和运行任意JavaScript代码。为什么是JS代码呢?因此Java允许使用外部引擎,而攻击者就使用了一个JS引擎。下面的函数是恶意软件用来运行传递的JS代码的。
恶意软件样本可以模拟JS
结论
ATMJaDi是一款针对性攻击的恶意软件,表明攻击者在开发恶意软件之前就对受害者进行了深入地分析和研究。而且需要明确的是攻击者必须要用对ATM的访问权限,因为定制的JAVA类运行的更像是Java程序源代码。
恶意软件被控制的方式也表明攻击者计划获取对受感染ATM的网络访问权限,一般来说这是通过银行的内部网络来实现的。
对此,研究人员建议银行:
· 使用特定的安全解决方案;
· 设置ATM文件白名单;
· 银行ATM网络必须进行隔离,并限制对其的访问。