Analysis
- max time kernel
1s - max time network
129s - platform
ubuntu-18.04_amd64 - resource
ubuntu1804-amd64-20260513-en - resource tags
arch:amd64arch:i386image:ubuntu1804-amd64-20260513-enkernel:4.15.0-213-genericlocale:en-usos:ubuntu-18.04-amd64system - submitted
18/10/2026, 12:22
Static task
static1
Behavioral task
behavioral1
Sample
install.sh
Resource
ubuntu1804-amd64-20260513-en
Behavioral task
behavioral2
Sample
install.sh
Resource
debian9-armhf-20260513-en
Behavioral task
behavioral3
Sample
install.sh
Resource
debian9-mipsbe-20260513-en
Behavioral task
behavioral4
Sample
install.sh
Resource
debian9-mipsel-20260513-en
General
- Target install.sh
- Size 25KB
- Sample261018-pkd4jsxt2p
- SHA256 6eaf139e16d45849bebc4a7de0dbc2992fd3b3a86a3f37bf7922b685f3a60d9e
- MD5 bab61584dbc45ee3f1a5c1f47421c881
- SHA1 b13e69d7b27e2c3007b54586e7bb7bfd5a78fd90
- SHA512 87af5c0c546169c1be7820f558fd6e906a096ec36c02ebcb25f0e0394c9822691945b90cb8c4d6afff9c571d660b530f3b7fa2eed70442904dd2b708efa39017
- SSDEEP 768:j7h5Ajfz7+hRds+4Uw4EgCv9VrwZkyefXCF3cjUa4JECWNgcG:j7hWL7nv99wZkye6F3cX4JECWNgN
- TLSH T150C2F6167DE29A33034A51FD6E879042336D1007412A6DA4F69CB5883F746B8F6F3B6E
- MD5 SHA1 SHA512 SSDEEP TLSH
Malware Config
Signatures
- File and Directory Permissions Modification 1 TTPs 1 IoCs
Adversaries may modify file or directory permissions to evade defenses.
pid Process 1569 chmod - Executes dropped EXE 2 IoCs
ioc pid Process /tmp/tmp.vc3eJCyt42/vp 1571 install.sh /tmp/tmp.vc3eJCyt42/vp 1574 install.sh - Deobfuscate/Decode Files or Information 1 TTPs 1 IoCs
Adversaries may deobfuscate or decode files or information to evade detection mechanisms.
pid Process 1563 base64 - Changes its process name 2 IoCs
description ioc pid Process Changes the process name, possibly in an attempt to hide itself tokio-rt-worker 1572 vp Changes the process name, possibly in an attempt to hide itself tokio-rt-worker 1575 vp - Enumerates kernel/hardware configuration 1 TTPs 4 IoCs
Reads contents of /sys virtual filesystem to enumerate system information.
description ioc Process File opened for reading /sys/fs/cgroup/cpu/cpu.cfs_quota_us vp File opened for reading /sys/fs/cgroup/cpu/cpu.cfs_period_us vp File opened for reading /sys/fs/cgroup/cpu/cpu.cfs_quota_us vp File opened for reading /sys/fs/cgroup/cpu/cpu.cfs_period_us vp -
description ioc Process File opened for reading /proc/filesystems sed File opened for reading /proc/filesystems sed File opened for reading /proc/filesystems tar File opened for reading /proc/self/maps vp File opened for reading /proc/self/cgroup vp File opened for reading /proc/self/maps vp File opened for reading /proc/self/maps awk File opened for reading /proc/filesystems sed File opened for reading /proc/filesystems sed File opened for reading /proc/self/cgroup vp - System Network Configuration Discovery 1 TTPs 2 IoCs
Adversaries may gather information about the network configuration of a system.
pid Process 1536 awk 1566 tar - Writes file to tmp directory 4 IoCs
Malware often drops required files in the /tmp directory.
description ioc Process File opened for modification /tmp/tmp.bWvJvEaswy mktemp File opened for modification /tmp/tmp.bWvJvEaswy curl File opened for modification /tmp/tmp.vc3eJCyt42/vp tar File opened for modification /tmp/tmp.vc3eJCyt42/package.json tar
Processes
-
/tmp/install.sh/tmp/install.sh1⤵
- Executes dropped EXE
PID:1497 -
/usr/bin/curlcurl -s https://registry.npmjs.org/vite-plus/latest2⤵PID:1500
-
-
/bin/grepgrep -q "\"error\""2⤵PID:1508
-
-
/bin/grepgrep -q "\"version\" *:"2⤵PID:1510
-
-
/bin/grepgrep -o "\"version\" *: *\"[^\"]*\""2⤵PID:1513
-
-
/usr/bin/cutcut "-d\"" -f42⤵PID:1515
-
-
/usr/bin/headhead -12⤵PID:1514
-
-
/bin/unameuname -s2⤵PID:1518
-
-
/bin/unameuname -m2⤵PID:1520
-
-
/usr/bin/getconfgetconf GNU_LIBC_VERSION2⤵PID:1522
-
-
/usr/bin/curlcurl -s "https://registry.npmjs.org/@voidzero-dev%2Fvite-plus-cli-linux-x64-gnu/1.3.0"2⤵PID:1527
-
-
/usr/bin/awkawk " function fail_json(message) { print message > \"/dev/stderr\" exit 2 } function skip_whitespace( c) { while (json_pos <= json_length) { c = substr(json_text, json_pos, 1) if (c == \" \" || c == \"\\t\" || c == \"\\r\" || c == \"\\n\") { json_pos++ } else { return } } } function parse_string( result, c, escaped, hex, code, i) { skip_whitespace() if (substr(json_text, json_pos, 1) != \"\\\"\") { fail_json(\"expected JSON string\") } json_pos++ while (json_pos <= json_length) { c = substr(json_text, json_pos, 1) json_pos++ if (c == \"\\\"\") { return result } if (c == \"\\\\\") { if (json_pos > json_length) { fail_json(\"unterminated JSON escape\") } escaped = substr(json_text, json_pos, 1) json_pos++ if (escaped == \"\\\"\" || escaped == \"\\\\\" || escaped == \"/\") { result = result escaped } else if (escaped == \"b\" || escaped == \"f\" || escaped == \"n\" || escaped == \"r\" || escaped == \"t\") { # Keep control escapes printable so extracted values cannot inject lines. result = result \"\\\\\" escaped } else if (escaped == \"u\") { hex = substr(json_text, json_pos, 4) if (length(hex) != 4 || hex ~ /[^0-9A-Fa-f]/) { fail_json(\"invalid JSON unicode escape\") } code = 0 for (i = 1; i <= 4; i++) { code = code * 16 + index(\"0123456789abcdef\", tolower(substr(hex, i, 1))) - 1 } # Decode printable ASCII once, including all SRI characters and # inspected keys. Keep other escapes printable so control characters # cannot inject lines into the extracted metadata. if (code >= 32 && code <= 126) { result = result sprintf(\"%c\", code) } else { result = result \"\\\\u\" hex } json_pos += 4 } else { fail_json(\"invalid JSON escape\") } } else { if (c ~ /[[:cntrl:]]/) { fail_json(\"unescaped control character in JSON string\") } result = result c } } fail_json(\"unterminated JSON string\") } function is_object_key(depth, key) { return path_kind[depth] == \"object-key\" && path_key[depth] == key } function remember_string(depth, value) { if (depth == 2 && is_object_key(1, \"dist\") && is_object_key(2, \"tarball\")) { if (++tarball_count != 1) fail_json(\"duplicate dist.tarball\") tarball = value } else if (depth == 2 && is_object_key(1, \"dist\") && is_object_key(2, \"integrity\")) { integrity = value } else if (depth == 4 && is_object_key(1, \"dist\") && is_object_key(2, \"attestations\") && is_object_key(3, \"provenance\") && is_object_key(4, \"predicateType\")) { if (++predicate_count != 1) fail_json(\"duplicate provenance predicateType\") predicate_type = value } else if (depth == 1 && is_object_key(1, \"error\")) { if (++error_count != 1) fail_json(\"duplicate registry error\") registry_error = value } } function parse_number( start, value, c) { start = json_pos while (json_pos <= json_length) { c = substr(json_text, json_pos, 1) if (c ~ /[-+0-9.eE]/) json_pos++ else break } value = substr(json_text, start, json_pos - start) if (value !~ /^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?\$/) { fail_json(\"invalid JSON number\") } } function parse_literal(literal) { if (substr(json_text, json_pos, length(literal)) != literal) { fail_json(\"invalid JSON literal\") } json_pos += length(literal) } function parse_array(depth, c, child_depth) { json_pos++ skip_whitespace() if (substr(json_text, json_pos, 1) == \"]\") { json_pos++ return } while (1) { child_depth = depth + 1 path_kind[child_depth] = \"array-item\" path_key[child_depth] = \"\" parse_value(child_depth) delete path_kind[child_depth] delete path_key[child_depth] skip_whitespace() c = substr(json_text, json_pos, 1) if (c == \"]\") { json_pos++ return } if (c != \",\") fail_json(\"expected comma in JSON array\") json_pos++ } } function parse_object(depth, key, child_depth, c, object_id) { json_pos++ object_id = ++object_count skip_whitespace() if (substr(json_text, json_pos, 1) == \"}\") { json_pos++ return } while (1) { key = parse_string() if ((object_id SUBSEP key) in object_keys) { fail_json(\"duplicate key in JSON object\") } object_keys[object_id SUBSEP key] = 1 skip_whitespace() if (substr(json_text, json_pos, 1) != \":\") { fail_json(\"expected colon in JSON object\") } json_pos++ child_depth = depth + 1 path_kind[child_depth] = \"object-key\" path_key[child_depth] = key parse_value(child_depth) delete path_kind[child_depth] delete path_key[child_depth] skip_whitespace() c = substr(json_text, json_pos, 1) if (c == \"}\") { json_pos++ return } if (c != \",\") fail_json(\"expected comma in JSON object\") json_pos++ } } function parse_value(depth, c, value) { skip_whitespace() c = substr(json_text, json_pos, 1) if (c == \"{\") { parse_object(depth) } else if (c == \"[\") { parse_array(depth) } else if (c == \"\\\"\") { value = parse_string() remember_string(depth, value) } else if (c == \"t\") { parse_literal(\"true\") } else if (c == \"f\") { parse_literal(\"false\") } else if (c == \"n\") { parse_literal(\"null\") } else if (c == \"-\" || c ~ /[0-9]/) { parse_number() } else { fail_json(\"invalid JSON value\") } } { json_text = json_text \$0 \"\\n\" } END { json_length = length(json_text) json_pos = 1 parse_value(0) skip_whitespace() if (json_pos <= json_length) fail_json(\"unexpected data after JSON value\") print tarball print predicate_type print registry_error print integrity } "2⤵
- Reads runtime system information
- System Network Configuration Discovery
PID:1536
-
-
/bin/sedsed -n 1p2⤵
- Reads runtime system information
PID:1539
-
-
/bin/sedsed -n 2p2⤵
- Reads runtime system information
PID:1542
-
-
/bin/sedsed -n 3p2⤵
- Reads runtime system information
PID:1545
-
-
/bin/sedsed -n 4p2⤵
- Reads runtime system information
PID:1548
-
-
/bin/mktempmktemp -d2⤵PID:1550
-
-
/bin/mktempmktemp2⤵
- Writes file to tmp directory
PID:1555
-
-
/usr/bin/curlcurl -fsSL "https://registry.npmjs.org/@voidzero-dev/vite-plus-cli-linux-x64-gnu/-/vite-plus-cli-linux-x64-gnu-1.3.0.tgz" -o /tmp/tmp.bWvJvEaswy2⤵
- Writes file to tmp directory
PID:1556
-
-
/usr/bin/sha512sumsha512sum2⤵PID:1560
-
-
/usr/bin/trtr -d " \\n"2⤵PID:1565
-
-
/usr/bin/odod -An -v -tx12⤵PID:1564
-
-
/usr/bin/base64base64 -d2⤵
- Deobfuscate/Decode Files or Information
PID:1563
-
-
/bin/tartar xzf /tmp/tmp.bWvJvEaswy -C /tmp/tmp.vc3eJCyt42 "--strip-components=1"2⤵
- Reads runtime system information
- System Network Configuration Discovery
- Writes file to tmp directory
PID:1566 -
/usr/local/sbin/gzipgzip -d3⤵PID:1567
-
-
/usr/local/bin/gzipgzip -d3⤵PID:1567
-
-
/usr/sbin/gzipgzip -d3⤵PID:1567
-
-
/usr/bin/gzipgzip -d3⤵PID:1567
-
-
/sbin/gzipgzip -d3⤵PID:1567
-
-
/bin/gzipgzip -d3⤵PID:1567
-
-
-
/bin/rmrm -f /tmp/tmp.bWvJvEaswy2⤵PID:1568
-
-
/bin/chmodchmod +x /tmp/tmp.vc3eJCyt42/vp2⤵
- File and Directory Permissions Modification
PID:1569
-
-
/tmp/tmp.vc3eJCyt42/vp/tmp/tmp.vc3eJCyt42/vp --help2⤵
- Changes its process name
- Enumerates kernel/hardware configuration
- Reads runtime system information
PID:1571
-
-
/tmp/tmp.vc3eJCyt42/vp/tmp/tmp.vc3eJCyt42/vp2⤵
- Changes its process name
- Enumerates kernel/hardware configuration
- Reads runtime system information
PID:1574
-
-
/bin/rmrm -rf -- /tmp/tmp.vc3eJCyt422⤵PID:1576
-
Network
MITRE ATT&CK Enterprise v16
Replay Monitor
Loading Replay Monitor...
Downloads
- Path /tmp/tmp.vc3eJCyt42/package.json
- Size 380B
- SHA256 ee6e46c86b981cdc5e38883bab5b2c3db79c2e43a56559857cfb410d3169e43d
- MD5 1c0eacd6b3dad051e5ba02911b7ae684
- SHA1 ae0353d1d7f5cc1511db9299dceb3bcce75f2e9b
- SHA512 61b5cbb4485a5f2037d326290b8846a79bb4ef3cfc31484e454e8815a6f363ceb4b2517130ac53c48a1bb712ef8022c3b8cad1a96615b8362312a69257222896
- TLSH T19BE0D861E46CDB634AFDA6A20E650085A6250CDFC6947E187B8F011C873D67712BEBF8
- MD5 SHA1 SHA512 TLSH
- Path /tmp/tmp.vc3eJCyt42/vp
- Size 10.2MB
- SHA256 6846c5403b9d3e991ebdd8b699d62c7d384707e9f95cf7f5aa1a357956b7ecbd
- MD5 930a357cc784978c0978f4aded217f8f
- SHA1 7d6d670c0494badeb67e5a9a3a15de844169342a
- SHA512 3952106f09f45984322fb93f3a23118a154ba8a30d12bfed6426e12dea8b6f54e287a7d4ab36bd756c05fec2b954ad505a37bbf1d0e0fa76f05dfa381e7f4318
- SSDEEP 98304:xBflc12P09yNvs/OfT23XyvcXIvJ3GUWHKH/6nyT19:tcAR+r6
- TLSH T158B62A43FAA290ECD6F9C434439AA637F721BC8D44343B675BE44B203E65F106B1AB95
- MD5 SHA1 SHA512 SSDEEP TLSH