PyPI / uv / 0.13.5

uv 0.13.5

Source
https://github.com/astral-sh/uv
Artifact scanned
uv-0.13.5.tar.gz (sdist · 7.2 MB · SHA-256 979409b8c9a7…)
Compared with
uv-0.13.4.tar.gz (0 signals introduced since)
Files
821 scanned, 215 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 43 info
Scan time
10.7 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 12 of 12 warn and critical signals; 12 demoted to info.
Disclude version
4.3.0
Scanned (UTC)
2026-10-23 09:45

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. info warn → info by review dynamic-execution README.md:42:1

    [embedded bash] pipeline feeds into `sh` — piped data is executed as shell code (ast pass, confidence 0.80)

    # On macOS and Linux.
    curl -LsSf https://astral.sh/uv/install.sh | sh
    likely benign LLM, confidence 0.85 Documentation of the official uv install script piped via curl to sh.
    Reasoning

    The README documents the standard uv installer one-liner, which is the official install method for the project. Piping a well-known vendor install script into sh is a common, legitimate pattern, though it is a supply-chain-sensitive practice worth noting.

  2. info warn → info by review unicode-mixed-script README.md:271:36

    identifier `juː` mixes scripts: Latin + Other (raw pass, confidence 0.80)

    
    It's pronounced as "you - vee" ([`/juː viː/`]https://en.wikipedia.org/wiki/Help:IPA/English#Key)
    
    #### How should I stylize uv?
    dismissed LLM, confidence 0.95 IPA phonetic notation in README prose triggers a mixed-script warning.
    Reasoning

    The IPA pronunciation annotation /juː viː/ naturally mixes Latin letters with IPA phonetic symbols (ː, ju). This is ordinary prose in a README, not an identifier used for deception.

  3. info warn → info by review unicode-mixed-script README.md:271:41

    identifier `viː` mixes scripts: Latin + Other (raw pass, confidence 0.80)

    
    It's pronounced as "you - vee" ([`/juː viː/`]https://en.wikipedia.org/wiki/Help:IPA/English#Key)
    
    #### How should I stylize uv?
    dismissed LLM, confidence 0.95 IPA phonetic notation in README prose triggers a mixed-script warning.
    Reasoning

    Same as the sibling finding: the IPA transcription 'viː' in documentation prose contains the length mark and is legitimate.

  4. info warn → info by review encoding-base64 crates/uv-client/src/html.rs:646:52

    base64-like blob (66 bytes, compression ratio 0.88) (raw pass, confidence 0.60)

    <h1>Links for jinja2</h1>
    <a href="/whl/Jinja2-3.1.2-py3-none-any.whl#sha256%3D4095ada29e51070f7d199a0a5bdf5c8d8e238e03f0bf4dcc02571e78c9ae800d">Jinja2-3.1.2-py3-none-any.whl</a><br/>
    </body>
    </html>
    dismissed LLM, confidence 0.93 Test HTML fixture with a sha256 fragment flagged as base64.
    Reasoning

    The snippet is an HTML test fixture containing a sha256 hash fragment in a link. The base64-like match is a false positive on hex-like content in a test page.

  5. info warn → info by review encoding-hex crates/uv-fs/src/path.rs:965:100

    18 consecutive `\xNN` escapes (entropy 4.2 bits/byte) (raw pass, confidence 0.65)

                    1..=0x5e,
                    r##"__import__("os").fsdecode(b"/foo/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^/bar")"##,
                ),
                (
    likely benign LLM, confidence 0.90 Test vector of byte escapes for Python os.fsdecode path round-tripping.
    Reasoning

    This is a Rust test table exercising path-to-Python fsdecode conversion of all byte values. The escapes are test data for byte-level path handling, embedded in a string literal, not executed by the Rust code itself. Test-case generation for non-UTF8 paths is legitimate.

  6. info warn → info by review encoding-escape-soup crates/uv-fs/src/path.rs:969:85

    37 consecutive `\xNN` escapes (entropy 5.2 bits/byte) (raw pass, confidence 0.80)

                    0x5f..=0xa3,
                    r#"__import__("os").fsdecode(b"/foo/_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3/bar")"#,
                ),
                (
    likely benign LLM, confidence 0.90 Test vector of byte escapes for path encoding tests.
    Reasoning

    Same test-table context: systematic byte-range escapes used to verify path encoding behaviour in a Rust unit test. The string is data, not executed here.

  7. info warn → info by review encoding-escape-soup crates/uv-fs/src/path.rs:973:53

    46 consecutive `\xNN` escapes (entropy 5.5 bits/byte) (raw pass, confidence 0.80)

                    0xa4..=0xd1,
                    r#"__import__("os").fsdecode(b"/foo/\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1/bar")"#,
                ),
                (
    likely benign LLM, confidence 0.90 Test vector of high-byte escapes for path encoding tests.
    Reasoning

    Systematic byte-range escape sequences within a Rust test fixture covering non-ASCII byte values. Legitimate exhaustive testing.

  8. info warn → info by review encoding-escape-soup crates/uv-fs/src/path.rs:977:53

    46 consecutive `\xNN` escapes (entropy 5.5 bits/byte) (raw pass, confidence 0.80)

                    0xd2..=u8::MAX,
                    r#"__import__("os").fsdecode(b"/foo/\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff/bar")"#,
                ),
            ] {
    likely benign LLM, confidence 0.90 Test vector of high-byte escapes for path encoding tests.
    Reasoning

    Final byte-range escape chunk of the same exhaustive path-encoding test table. Legitimate test data.

  9. info proc-macro-presence crates/uv-macros/src/lib.rs:12:1

    proc-macro attribute `#[proc_macro_derive]` present (ast pass, confidence 0.95)

    /// the formatter out of line to avoid duplicating it at call sites.
    #[proc_macro_derive(DebugNoInline)]
    pub fn derive_debug_no_inline(input: TokenStream) -> TokenStream {
        let input = parse_macro_input!(input as DeriveInput);
  10. info unicode-homoglyph crates/uv-normalize/src/lib.rs:231:20

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                "space in middle",
                "alpha-α",
            ];
            for input in failures {
  11. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1421:39

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

            assert_snapshot!(
                parse_pep508_err("foo[bar α]"),
                @"
            Expected either `,` (separating extras) or `]` (ending the extras section), found `α`
  12. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1423:92

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                @"
            Expected either `,` (separating extras) or `]` (ending the extras section), found `α`
            foo[bar α]
                    ^
  13. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1424:17

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

            Expected either `,` (separating extras) or `]` (ending the extras section), found `α`
            foo[bar α]
                    ^
            "
  14. info unicode-mixed-script crates/uv-pep508/src/lib.rs:1764:31

    identifier `wheelѦ` mixes scripts: Latin + Cyrillic (in string/comment) (raw pass, confidence 0.40)

            assert_snapshot!(
                parse_pep508_err("wheelѦ"),
                @"
            Expected one of `@`, `(`, `<`, `=`, `>`, `~`, `!`, `;`, found `Ѧ`
  15. info unicode-mixed-script crates/uv-pep508/src/lib.rs:1767:9

    identifier `wheelѦ` mixes scripts: Latin + Cyrillic (in string/comment) (raw pass, confidence 0.40)

            Expected one of `@`, `(`, `<`, `=`, `>`, `~`, `!`, `;`, found `Ѧ`
            wheelѦ
                 ^
            ");
  16. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1823:63

    identifier `αx` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

            assert_snapshot!(
                parse_pep508_err(r#"foo; python_version == "3.12" αx"#),
                @r#"
            Unexpected character 'α', expected 'and', 'or' or end of input
  17. info unicode-mixed-script crates/uv-pep508/src/lib.rs:1823:63

    identifier `αx` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            assert_snapshot!(
                parse_pep508_err(r#"foo; python_version == "3.12" αx"#),
                @r#"
            Unexpected character 'α', expected 'and', 'or' or end of input
  18. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1825:31

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                @r#"
            Unexpected character 'α', expected 'and', 'or' or end of input
            foo; python_version == "3.12" αx
                                          ^^
  19. info unicode-homoglyph crates/uv-pep508/src/lib.rs:1826:39

    identifier `αx` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

            Unexpected character 'α', expected 'and', 'or' or end of input
            foo; python_version == "3.12" αx
                                          ^^
            "#
  20. info unicode-mixed-script crates/uv-pep508/src/lib.rs:1826:39

    identifier `αx` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            Unexpected character 'α', expected 'and', 'or' or end of input
            foo; python_version == "3.12" αx
                                          ^^
            "#
  21. identifier `αx` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

        fn test_marker_expression_non_ascii_trailing() {
            let err = MarkerExpression::from_str(r#"os_name == "nt" αx"#)
                .unwrap_err()
                .to_string();
  22. identifier `αx` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

        fn test_marker_expression_non_ascii_trailing() {
            let err = MarkerExpression::from_str(r#"os_name == "nt" αx"#)
                .unwrap_err()
                .to_string();
  23. identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                @r#"
            Unexpected character 'α', expected end of input
            os_name == "nt" αx
                            ^^
  24. identifier `αx` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

            Unexpected character 'α', expected end of input
            os_name == "nt" αx
                            ^^
            "#
  25. identifier `αx` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            Unexpected character 'α', expected end of input
            os_name == "nt" αx
                            ^^
            "#
  26. identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                // Unicode
                "α",
                "férrîs",
                "안녕하세요",
  27. base64-like blob (68 bytes, compression ratio 0.91) (in comment) (raw pass, confidence 0.36)

                    // Python implementations vary
                    // https://github.com/pypa/pyproject-metadata/pull/150/files#diff-7d938dbc255a08c2cfab1b4f1f8d1f6519c9312dd0a39d7793fa778474f1fbd1L135-R141
                    let _ = writeln!(writer, "{}{}", " ".repeat(key.len() + 2), line);
                }
  28. info warn → info by review encoding-base64 crates/uv-test/src/lib.rs:2591:6

    base64-like blob (112 bytes, compression ratio 1.01) (raw pass, confidence 0.60)

        "cGF0Cg==",
        "MTFBQlVDUjZBMERMUTQ3aVphN3hPdV9qQmhTMkZUeHZ4ZE13OHczakxuZndsV2ZlZjc2cE53eHBWS2tiRUFwdnpmUk8zV0dDSUhicDFsT01aago=",
    ];
    likely benign LLM, confidence 0.90 Base64 test fixture values in a Rust test crate.
    Reasoning

    The array holds base64 values in a test crate, including strings like 'cGF0Cg==' (decodes to 'pat'). These are test fixtures for credential or string handling; the snippet shows no decoding-and-execution behaviour.

  29. info warn → info by review encoding-base64 crates/uv-test/src/lib.rs:2599:6

    base64-like blob (112 bytes, compression ratio 1.00) (raw pass, confidence 0.60)

        "cGF0Cg==",
        "MTFBQlVDUjZBMDJTOFYwMTM4YmQ0bV9uTXpueWhxZDBrcllROTQ5SERTeTI0dENKZ2lmdzIybDFSR2s1SE04QW8xTUVYQ1I0Q1YxYUdPRGpvZQo=",
    ];
    likely benign LLM, confidence 0.85 Base64 test fixture values in a Rust test crate.
    Reasoning

    Base64 strings in a test array, consistent with test fixtures for token or credential handling in uv's test suite. No execution context appears.

  30. info warn → info by review encoding-base64 crates/uv-test/src/lib.rs:2602:52

    base64-like blob (548 bytes, compression ratio 0.71) (raw pass, confidence 0.60)

    ub const READ_ONLY_GITHUB_SSH_DEPLOY_KEY: &str = "LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0emMyZ3RaVwpReU5UVXhPUUFBQUNBeTF1SnNZK1JXcWp1NkdIY3Z6a3AwS21yWDEwdmo3RUZqTkpNTkRqSGZPZ0FBQUpqWUpwVnAyQ2FWCmFRQUFBQXR6YzJndFpXUXlOVFV4T1FBQU
    likely benign LLM, confidence 0.85 Base64-encoded SSH deploy key constant used as a test fixture.
    Reasoning

    The constant is a base64-encoded OpenSSH private key, which decodes to a test deploy key in the 'READ_ONLY' naming. It is a test fixture for SSH git tests. Because it is a private key, it warrants a check that it is not a live credential, but the name and format suggest a fake or read-only test key.

  31. info warn → info by review encoding-base64 crates/uv-types/src/hash.rs:751:150

    base64-like blob (71 bytes, compression ratio 0.90) (raw pass, confidence 0.60)

            let first = UnresolvedRequirement::Named(requirement(
                "https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl#sha256=CFDB2B588B9FC25EDE96D8DB56ED50848B0B649DCA3DD1DF0B11F683BB9E0B5F",
            ));
    dismissed LLM, confidence 0.93 Package URL with a sha256 fragment in a Rust test.
    Reasoning

    The base64-like blob is a sha256 hash fragment in a package URL inside a unit test, which is ordinary requirement-parsing test data.

  32. compression ratio 0.837 is >2σ above file mean 0.808 (raw pass, confidence 0.50)

        ]
        sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104, upload-time = "2020-10-14T10:20:18.572Z" }
        wheels = [
  33. compression ratio 0.837 is >2σ above file mean 0.808 (raw pass, confidence 0.50)

        ]
        sdist = { url = "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", size = 8104, upload-time = "2020-10-14T10:20:18.572Z" }
        wheels = [
  34. compression ratio 0.910 is >2σ above file mean 0.787 (raw pass, confidence 0.50)

                { url = "http://[LOCALHOST]/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" },
            ]
            "#
  35. compression ratio 0.811 is >2σ above file mean 0.788 (raw pass, confidence 0.50)

            { url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", size = 33926, upload-time = "2024-02-25T22:12:47.72Z" },
        ]
  36. compression ratio 0.909 is >2σ above file mean 0.813 (raw pass, confidence 0.50)

        let requirements_in = context.temp_dir.child("requirements.in");
        requirements_in.write_str("flask @ https://files.PYTHONHOSTED.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl")?;
    
        uv_snapshot!(context.filters(), context.pip_compile()
  37. compression ratio 0.903 is >2σ above file mean 0.792 (raw pass, confidence 0.50)

            sdist = { url = "http://[LOCALHOST]/basic-auth/files/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" }
            wheels = [
  38. compression ratio 0.889 is >2σ above file mean 0.792 (raw pass, confidence 0.50)

                { url = "http://[LOCALHOST]/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" },
            ]
  39. compression ratio 0.903 is >2σ above file mean 0.792 (raw pass, confidence 0.50)

            sdist = { url = "http://[LOCALHOST]/basic-auth/files/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" }
            wheels = [
  40. compression ratio 0.889 is >2σ above file mean 0.792 (raw pass, confidence 0.50)

                { url = "http://[LOCALHOST]/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" },
            ]
  41. compression ratio 0.879 is >2σ above file mean 0.804 (raw pass, confidence 0.50)

        version = "2.0.0"
        archive = { url = "http://public:heron@[LOCALHOST]/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hashes = { sha256 = "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" } }
    
        ----- stderr -----
  42. compression ratio 0.902 is >2σ above file mean 0.802 (raw pass, confidence 0.50)

    
        hint: You're on [PLATFORM] (`[TAG]`), but `a` (v1.0.0) only has wheels for the following platform: `macosx_10_0_ppc64`; consider adding "sys_platform == '[PLATFORM]' and platform_machine == '[MACHINE]'" to `tool.uv.required-environments` to ensure uv resolves to a version with compatible wheels
        "#);
  43. compression ratio 0.801 is >2σ above file mean 0.695 (raw pass, confidence 0.50)

                { name = "outer", directory = "../" },
                { name = "workspace-member-in-subdir", git = "https://github.com/astral-sh/workspace-in-root-test?subdirectory=workspace-member-in-subdir&rev=d3ab48d2338296d47e28dbb2fb327c5e2ac4ac68" },
            ]

Reproduce This Scan

Run disclude locally to verify. These commands scan the published file; the "new in this release" marks come from comparing it with the previous release's file, which they don't repeat. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.3.0
curl -fsSL -o uv-0.13.5.tar.gz https://files.pythonhosted.org/packages/de/f0/7565e80415f841c3500ed69d86516c7676e3b24470a218ab61b1f43071a2/uv-0.13.5.tar.gz
printf '%s  %s\n' 979409b8c9a78df140ffb19c53f511b7a73526da8d1d5e36558833055e371c6c uv-0.13.5.tar.gz | shasum -a 256 -c -
mkdir pkg && tar -xzf uv-0.13.5.tar.gz -C pkg --strip-components 1
disclude scan --untrusted --severity info pkg