The crate's build script runs curl against a unique canarytokens.com URL, telling the token's creator the compiling machine's public IP address and the time; it sends no other data, and the library is an empty placeholder.
On June 19, 2025, the crates.io account darshanjogi published sec-gemini 0.0.2, described only as "Security crate". It is the crate's only version and the account's only crate. The crate has no dependencies, no repository and no documentation, and its library is a single placeholder function. Its build script runs curl against a Canarytokens tracking URL, http://canarytokens.com/images/8c6xev8iguyak4u9hdkuzidvk/contact.php, every time Cargo compiles the crate. That request tells whoever created the token that the crate was compiled, when, and from which public IP address. It sends no files, environment variables or other data from the machine, and it downloads nothing that is kept or run. The name matches sec-gemini on PyPI, the Python SDK for the Sec-Gemini security AI agent, which was first uploaded about six weeks earlier. crates.io has since removed the crate, after about 16 months online, from June 19, 2025.
What the package does
Compiling sec-gemini 0.0.2 (crate sha256 5f247871a84a6e859655f5a0b8106f17e0f7e27ea4b2fbdd65e0c7fda4a0bf43), on its own or as a dependency, does this:
- Cargo compiles and runs the crate's build script before it compiles the library. This happens on every compile, including
cargo check, cargo test and cargo install, and in editors whose rust-analyzer runs build scripts when a project is opened.
- The build script starts
curl http://canarytokens.com/images/8c6xev8iguyak4u9hdkuzidvk/contact.php. curl resolves canarytokens.com and sends a plain HTTP GET on port 80, with its default headers (Host, User-Agent: curl/<version>, Accept: */*).
- canarytokens.com is a public service that hands out unique URLs and notifies the person who created one each time it is requested, with the requester's IP address, the time and the request headers. The URL path is unique to one token, so each request reaches one person: the creator of token
8c6xev8iguyak4u9hdkuzidvk.
- The response is printed to the build script's standard output. Cargo keeps that output in the target directory and does not show it, so nothing appears on the terminal. The script ignores curl's result, so the crate compiles the same way whether the request succeeds, fails or curl is missing.
- The library holds one function,
ping(), which prints Hello from sec-gemini. Using the crate does nothing else.
What the code does
The crate holds four files: Cargo.toml, the Cargo.toml.orig it was generated from, build.rs (sha256 d5b554e9a14c2bd2fe5ca4e546f43cd0b24659f27981ff18873a9788d0381f7e, 8 lines) and src/lib.rs (4 lines).
Cargo.toml:16 (Cargo.toml.orig:5) names build.rs as the crate's build script, so Cargo runs build.rs on every compile of the crate. Cargo.toml:17 gives the whole description, "Security crate". Cargo.toml:20 lists no dependencies.
build.rs:4–6 is the whole build script: Command::new("curl").arg("http://canarytokens.com/images/8c6xev8iguyak4u9hdkuzidvk/contact.php").status(). It passes the URL and nothing else: no host name, user name, path or environment value is added to it, and curl sends no request body. let _ = drops the result of status(), so a failure is never reported.
build.rs prints no cargo:rerun-if-changed line, so Cargo runs it again whenever any file in the crate changes, and on every fresh compile in a new target directory or on a fresh CI runner.
src/lib.rs:1–4 is the comment // Empty crate – placeholder and pub fn ping(), which prints Hello from sec-gemini. Nothing in the crate relates to security or to Gemini.
What leaves the machine is one HTTP request that reveals its public IP address, the time and the curl version. The crate takes the name of an existing project's SDK from another registry, gives itself no function, and reports each compile to a tracking URL. That is the shape of a probe that counts who installs a name, as in dependency-confusion research. It does not read, collect or send anything from the machine, and it does not change the machine.
Timeline (UTC)
| When | What |
| 05/05/25 20:41:10 | sec-gemini 0.0.1, the Python SDK for Sec-Gemini, is first uploaded to PyPI |
| 06/19/25 19:18:37 | sec-gemini 0.0.2 is published to crates.io by darshanjogi, the crate's only version |
| 11/06/26 | sec-gemini is removed from crates.io, about 16 months after it was published |
If you installed it
The crate sends nothing but the request itself, so no credentials need rotating because of it.
- Remove
sec-gemini from your Cargo.toml and Cargo.lock. If you meant the Sec-Gemini SDK, it is a Python package; this crate is not part of it.
- Delete the crate from Cargo's cache (
~/.cargo/registry/cache/*/sec-gemini-0.0.2.crate and ~/.cargo/registry/src/*/sec-gemini-0.0.2/) and run cargo clean in projects that depended on it.
- To see whether a machine compiled it, search proxy and DNS logs for canarytokens.com and for the path
/images/8c6xev8iguyak4u9hdkuzidvk/contact.php. The creator of the token has that machine's public IP address and the time it was compiled.