Correction: An earlier version of this post identified the protocol used as the TSAA protocol. This malware uses the TriStation protocol, which is proprietary and undocumented. Thanks to Jimmy Wylie for the correction.
What is Triton?
Triton is a new malware framework targeting safety systems monitoring SCADA networks. It’s designed to run from within a compromised network, allowing the attacker to observe and control Triconex Safety Instrumented System (SIS) devices.
It has been reported that the attackers copied a malicious file (trilog.exe) onto a management workstation, a Windows PC, and used that vantage point to attempt to write new firmware to the memory of SIS devices.
Device firmware is designed to be updated remotely. A physical key on the front of the device allows the user to switch between a PROGRAM mode, where modifications are allowed, and others, such as read-only RUN. The attackers used this capability as designed and relied on users to have left the device in PROGRAM mode.
Although Triton did not leverage any vulnerabilities, Nessus can identify the early stages of the attack.
Which devices were attacked by Triton?
Triton attacked Triconex Main Processors, model 3008. These safety monitoring systems were approved for use by the United States Nuclear Regulatory Commission in 2012.
What’s the impact?
If successful, this attack could have run arbitrary code on critical safety monitoring systems, concealing or causing physical damage to monitored systems.
Did the attackers need to reverse engineer the devices?
The attackers didn’t necessarily reverse engineer the devices. The US Nuclear Regulatory Commission maintains copies of the programming guides and communications manuals in use at the time of their approval. Appendix D documents the TSAA (TriStation) protocol, including the WRITE_TRICON_DATA command this malware likely used.
The protocol is simple, and has no authentication. The only facet of security it supplies is a per-message CRC.
Tenable coverage of Triton
Malware detection plugin
Tenable can detect if the management station contains Triton through its malware detection plugin. Here’s an example of a Triton hash detected with the Malicious Process Detection plugin ID 59275:
Tenable customers can also use YARA rules to identify affected systems through the Malicious File Detection Using Yara Nessus plugin. Here’s a sample rule that can be used with Nessus to detect Triton:
author = "nicholas.carr @itsreallynick"
md5 = "0face841f7b2953e7c29c064d6886523"
description = "TRITON framework recovered during Mandiant ICS incident response"
$python_compiled = ".pyc" nocase ascii wide
$python_module_01 = "__module__" nocase ascii wide
$python_module_02 = "<module>" nocase ascii wide
$python_script_01 = "import Ts" nocase ascii wide
$python_script_02 = "def ts_" nocase ascii wide
$py_cnames_01 = "TS_cnames.py" nocase ascii wide
$py_cnames_02 = "TRICON" nocase ascii wide
$py_cnames_03 = "TriStation " nocase ascii wide
$py_cnames_04 = " chassis " nocase ascii wide
$py_tslibs_01 = "GetCpStatus" nocase ascii wide
$py_tslibs_02 = "ts_" ascii wide
$py_tslibs_03 = " sequence" nocase ascii wide
$py_tslibs_04 = /import Ts(Hi|Low|Base)[^:alpha:]/ nocase ascii wide
$py_tslibs_05 = /module\s?version/ nocase ascii wide
$py_tslibs_06 = "bad " nocase ascii wide
$py_tslibs_07 = "prog_cnt" nocase ascii wide
$py_tsbase_01 = "TsBase.py" nocase ascii wide
$py_tsbase_02 = ".TsBase(" nocase ascii wide
$py_tshi_01 = "TsHi.py" nocase ascii wide
$py_tshi_02 = "keystate" nocase ascii wide
$py_tshi_03 = "GetProjectInfo" nocase ascii wide
$py_tshi_04 = "GetProgramTable" nocase ascii wide
$py_tshi_05 = "SafeAppendProgramMod" nocase ascii wide
$py_tshi_06 = ".TsHi(" ascii nocase wide
$py_tslow_01 = "TsLow.py" nocase ascii wide
$py_tslow_02 = "print_last_error" ascii nocase wide
$py_tslow_03 = ".TsLow(" ascii nocase wide
$py_tslow_04 = "tcm_" ascii wide
$py_tslow_05 = " TCM found" nocase ascii wide
$py_crc_01 = "crc.pyc" nocase ascii wide
$py_crc_02 = "CRC16_MODBUS" ascii wide
$py_crc_03 = "Kotov Alaxander" nocase ascii wide
$py_crc_04 = "CRC_CCITT_XMODEM" ascii wide
$py_crc_05 = "crc16ret" ascii wide
$py_crc_06 = "CRC16_CCITT_x1D0F" ascii wide
$py_crc_07 = /CRC16_CCITT[^_]/ ascii wide
$py_sh_01 = "sh.pyc" nocase ascii wide
$py_keyword_01 = " FAILURE" ascii wide
$py_keyword_02 = "symbol table" nocase ascii wide
$py_TRIDENT_01 = "inject.bin" ascii nocase wide
$py_TRIDENT_02 = "imain.bin" ascii nocase wide
2 of ($python_*) and 7 of ($py_*) and filesize < 3MB
What can you do to protect your organization from Triton?
Ensure all Tricon processors are not in PROGRAM mode. A physical key on each device can prevent this malware from succeeding. After initial programming of the device is complete, the key should be switched to RUN or REMOTE.
You should monitor management stations for malware. These are highly valuable pivot points to the Distributed Control System network.
Tricon devices can be configured with an IP or subnet whitelist. You should configure this access control to only allow communication from management stations and the DCS and SIS networks. This will limit the use of active security controls within these networks, which is why a monitoring solution such as Nessus Network Monitor is essential.
Stay tuned for more updates
Tenable is keeping a close eye on this story as it develops. Our team will release coverage as information becomes available, and this post will be updated if new plugins are released.