Компания Stairwell сообщила об обнаружении 637 новых вариантов вредоносного программного обеспечения, связанных с китайской группировкой продвинутых постоянных угроз (APT) Salt Typhoon. Результаты были получены на основе анализа первоначальных правил YARA, опубликованных Агентством по кибербезопасности и безопасности инфраструктуры США (CISA) в конце августа.
Описание
В совместном консультативном документе CISA описывается масштабная и долговременная кампания группировки Salt Typhoon, также известной как GhostEmperor. Эти акторы нацелены на телекоммуникационные компании, правительственные и военные структуры по всему миру с 2021 года, в основном используя уязвимости в сетевых устройствах и граничных маршрутизаторах.
Кампания характеризуется стремлением к постоянному доступу и скрытому извлечению данных, с активным использованием специализированных SFTP-клиентов, утилит для захвата пакетов и туннелирующих протоколов для перемещения по сети через скомпрометированные маршрутизаторы. В качестве части рекомендаций CISA включила два правила YARA, предназначенных для обнаружения связанного инструментария.
Из двух опубликованных правил YARA только одно - SALT_TYPHOON_CMD1_SFTP_CLIENT - дало совпадение с одним образцом в наборе данных Stairwell. Исследователи использовали этот образец в качестве отправной точки для поиска вариантов и изучения способов расширения покрытия обнаружения для более широкого набора связанных образцов.
Применение технологии обнаружения вариантов позволило выявить более десятка близких вариантов, многие из которых не обнаруживались исходным правилом YARA. Это указывает на возможности улучшения покрытия правил без потери точности. Создание эффективных правил YARA всегда представляет собой баланс между обобщением для обнаружения нескольких вариантов, специфичностью для избежания ложных срабатываний и устойчивостью к незначительным изменениям или обфускации.
Исходное правило было настроено на соответствие очень специфичным байтовым шаблонам или строкам из известного образца, что является безопасным первоначальным подходом, особенно в публичных отчетах, где ложные срабатывания вызывают беспокойство. Однако это может ограничивать применимость across всей семейства вредоносного ПО.
Исследователи Stairwell разработали обновленную логику обнаружения под названием ST_cmd1_SFTP_Variants, которая фокусируется на ключевых строковых артефактах, ссылках на библиотеки и путях к файлам, обнаруженных across всего кластера. Цель нового правила - не воспроизводить точность исходного правила CISA, а расширить охват across всего семейства вредоносного ПО, выявляя как известные, так и смежные варианты с высокой достоверностью.
Применение этого правила к набору данных дало 637 совпадений, включая исходное совпадение CISA и 636 структурно схожих вариантов. В большинстве совпадений структурное сходство было чрезвычайно высоким, что было визуализировано с помощью анализа кривых Гильберта в платформе Stairwell.
Среди совпадений также были пограничные случаи, такие как бинарные файлы, скомпилированные из Stowaway и evilginx2. Оба являются инструментами с открытым исходным кодом, часто используемыми в операциях красных команд, но также широко применяемыми злоумышленниками в реальных атаках. Хотя они отличаются от инструментов SFTP, описанных в отчете CISA, они совпали на основе общих характеристик сборки Go, перекрывающихся сторонних библиотек и схожих строковых артефактов времени выполнения.
Stowaway предоставляет возможности туннелирования с множественными переходами и выполнения команд, в то время как evilginx2 позволяет проводить фишинговые кампании, обходящие многофакторную аутентификацию через перехват сеансов. Их присутствие в наборе совпадений подчеркивает, как обнаружение вариантов может выявлять инструменты двойного назначения или операционно смежные инструменты, представляющие существенный риск на практике.
Отчет CISA предоставил прочную основу для защитников, включив индикаторы компрометации и логику обнаружения. Применяя обнаружение вариантов, исследователи смогли расширить эту работу для выявления дополнительных образцов и увеличения видимости across более широкого спектра активности.
Этот пример демонстрирует, как общедоступная разведка об угрозах может быть операционализирована. Сначала путем идентификации первоначального совпадения, затем с использованием Stairwell для обогащения данных и обнаружения вариантов, и наконец путем настройки обнаружений для охвата развивающегося объема связанной активности.
Даже один совпадающий файл может раскрыть более широкое понимание набора инструментов субъекта угрозы, если следовать по хлебным крошкам. В данном случае выпуск CISA дал точку входа, а механизм обнаружения вариантов помог составить остальную часть карты.
Для защитников крайне важно не только потреблять общедоступную разведку, но и использовать ее для совершенствования собственных обнаружений и расширения охвата. Будь то Salt Typhoon или следующая кампания, сочетание общих отчетов об угрозах с возможностями Stairwell является мощным способом оставаться на шаг впереди.
Индикаторы компрометации
SHA256
- 0e8ed0c02275824da54dbf82cbc408460728ab0d1f5cdbb5285241f7716208a2
- 69c2083e7d401e0fe61230c271e94b84e4c1e8edf180501ae56d072282525db0
- d1f7bc8e97e5621bea311692e930208edc63aa6f07a514feee3afe4373ac5559
- ef5caf3c20317f6e5a50cab2a318f9d148f2bd801bd3dd540afed5411d3bb938
- f2bbba1ea0f34b262f158ff31e00d39d89bbc471d04e8fca60a034cabe18e4f4
Индикаторы компрометации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | rule ST_cmd1_SFTP_Variants { meta: author = "stairwell_auto" date = "2025-09-10" description = "Detects Go-based malware similar to SALT_TYPHOON_CMD1_SFTP_CLIENT" hash = "f2bbba1ea0f34b262f158ff31e00d39d89bbc471d04e8fca60a034cabe18e4f4" strings: $s1 = "Program running in background: %sdoaddtimer: P already set in timerexecutable file not found in $PATHforEachP: sched.safePointWait != 0illegal base64 data at input byte in \\u hexadecimal character escapemspan.ensureSwept: m is not lockedout of memory allocating allArenasreflect: ChanDir of non-chan type reflect: Field index out of boundsreflect: Field of non-struct type reflect: string index out of rangeruntime.SetFinalizer: cannot pass runtime: g is running but p is notruntime: netpollBreak write failedschedule: spinning with local workslice bounds out of range [%x:%y:]slice bounds out of range [:%x:%y]too many references: cannot splicex protocol version mismatch: %d.%d177635683940025046467781066894531252006-01-02T15:04:05.999999999Z07:0088817841970012523233890533447265625attempt to clear non-empty span setfile type does not support deadlinefindrunnable: netpoll with spinningflate: corrupt input before offset gif: can't read graphic control: %sgreyobject: obj not pointer-alignedmheap.freeSpanLocked - invalid freemismatched begin/end of activeSweepnetwork dropped connection on resetno such multicast network interfacepersistentalloc: align is too largepidleput: P has non-empty run queuereflect.MakeSlice of non-slice typeruntime: close polldesc w/o unblockruntime: inconsistent read deadlineryuFtoaFixed32 called with prec > 9too many Questions to pack (>65535)traceback did not unwind completelytransport endpoint is not connectedzlib: invalid compression level: %d) is larger than maximum page size () is not Grunnable or Gscanrunnable" ascii $s2 = "github.com/jezek/xgb.(*Conn).readResponses.func1" ascii $s3 = "h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=" ascii $s4 = "/usr/lib/go-1.19/src/os/user/lookup.go" ascii $s6 = "Stowaway/agent/initial.SoReusePassive.func1" ascii $s7 = "*protocol.SSHTunnelRes" ascii $s8 = "/usr/lib/go-1.19/src/runtime/cgo/asm_amd64.s" ascii $s9 = "/usr/lib/go-1.19/src/runtime/chan.go" ascii $s10 = "github.com/jezek/xgb.(*Conn).readResponses.func3" ascii $s11 = "github.com/kbinani/screenshot/internal/util.CreateImage.func1" ascii $s12 = "/usr/lib/go-1.19/src/internal/fmtsort/sort.go" ascii $s13 = "rsa-sha2L9" ascii $s14 = "github.com/jezek/xgb/xproto.init.19" ascii $s15 = "/usr/lib/go-1.19/src/runtime/preempt.go" ascii $s18 = "monitor capture CAP" $s19 = "export ftp://%s:%s@%s%s" $s20 = "main.CapExport" $s21 = "main.SftpDownload" $s22 = ".(*SSHClient).CommandShell" $aes = "aes.decryptBlockGo" $buildpath = "C:/work/sync_v1/cmd/cmd1/main.go" condition: (uint32(0) == 0x464c457f or (uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550) or ((uint32(0) == 0xcafebabe) or (uint32(0) == 0xfeedface) or (uint32(0) == 0xfeedfacf) or (uint32(0) == 0xbebafeca) or (uint32(0) == 0xcefaedfe) or (uint32(0) == 0xcffaedfe))) and 5 of them } |