Higress Team: After Two Supply-Chain Poisonings of LiteLLM, the Blast Radius Depends on Default Permissions in Extension Code
Following the second supply-chain poisoning incident involving LiteLLM, the Higress team posits that while attacks cannot be entirely eradicated, the scope of damage is determined by the default permissions granted to extension code. Python-based proxies possess full process privileges through their dependencies and callbacks, whereas Wasm sandboxes restrict malicious code to request processing limits by revoking file system access, arbitrary network connectivity, and process spawning capabilities.
On October 21, 2026, LiteLLM version 1.107.0 was isolated just 1.7 hours after its release on PyPI; however, attackers had already used stolen AWS credentials to invoke bedrock:ListFoundationModels within less than five hours. This marked the second supply-chain poisoning of LiteLLM within six months, with attackers targeting nearly identical assets: cloud credentials, SSH private keys, Kubernetes (K8s) tokens, and all upstream model API keys centrally stored in the proxy database.
In its incident analysis, the Higress team raised a more fundamental question than 'how to prevent poisoning': since poisoning will inevitably occur, how can we ensure that malicious code gains nothing even if it infiltrates the system? Their answer is that the true determinant of the blast radius is the amount of default privilege held by extension code.
This assessment stems from a comparison of two proxy architectures. LiteLLM operates as a Python process where third-party dependencies and custom callbacks are essentially in-process Python code, possessing the exact same privileges as the proxy process itself—meaning files readable, environment variables visible, networks connectable, and subprocesses launchable by the proxy are equally accessible to malicious code. The infostealer in version 1.107.0 exploited this precisely: utilizing .pth startup hooks to execute automatically upon interpreter launch, it read ~/.aws/credentials, ~/.ssh/id_rsa, K8s ServiceAccount Tokens, and even connected directly to the proxy database to query the LiteLLM_CredentialsTable.