Supply-chain threat intelligence

Incident detail

criticalpypi·typosquatting·osv

Malicious code in sklern (PyPI)

sklern

Risk score

92

AI summary

Indexed incident for sklern (pypi).

Description

Package name 'sklern' is a one-character deletion from the top-tier ML package 'sklearn', and its public API (linear_regression, logistic_regression, decision_tree, perceptron, mlp, etc.) mimics sklearn's surface but the functions do not implement ML — they print code strings. On import sklern, src/sklern/init.py loads src/sklern/ai_helper.py, which at module top level instantiates a Groq client with a hardcoded API key (Groq(api_key="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")). The exported get1(prompt) function — re-exported in __all__ — sends the caller's prompt to api.groq.com using that hardcoded key, with no mechanism for the caller to override the destination or credential. PKG-INFO description is the placeholder 'Example PyPI package' and README references 'sample_package'. A developer who mistypes 'sklearn' as 'sklern' installs a package that (a) does not provide the ML functionality its API names suggest, (b) ships a live third-party credential that any installer can extract and abuse against api.groq.com, and (c) silently relays caller-supplied prompt data through the author's Groq account where it may be logged. The combination of name-confusion attack + credential distribution + silent-relay of caller data is the typosquat-with-payload pattern.

Technical details

Indicators

  • affected version<function fixed() { [native code] }75%
  • affected version<function fixed() { [native code] }75%
  • affected version<function fixed() { [native code] }75%
  • affected version<function fixed() { [native code] }75%
  • affected version<function fixed() { [native code] }75%
  • affected version<function fixed() { [native code] }75%

Timeline

  1. Advisory published
  2. Indexed by ThreatPkg

Related incidents