Skip to content

deps: triar a #2062 (grupo uv-minor-patch, 42 pacotes): sqlalchemy 2.1 decodifica o nome do banco e pylock.toml fora de sincronia #2069

Open

Description

@FabioLeitao

O que

A PR #2062 do Dependabot (grupo uv-minor-patch, 42 pacotes) não é mergeável hoje, por três motivos independentes. Verificado em 2026-10-12 contra a main cd2b56ba, lendo o uv.lock da PR e reproduzindo o caso com as duas versões.

1. sqlalchemy 2.0.54 → 2.1.3 muda o nome do banco que chega ao driver

tests/test_findings_sink.py::test_sqlalchemy_url_encodes_database_so_query_cannot_override_peer falha. O repo monta postgresql://db.example.com:5432/audit%3Fhostaddr%3D10.0.0.9 (quote(database, safe="") em core/findings_sink.py::_sqlalchemy_url). Reproduzido em ambiente isolado:

2.0.54 2.1.3
host db.example.com db.example.com
query {} {}
database (e translate_connect_args()['database']) 'audit%3Fhostaddr%3D10.0.0.9' 'audit?hostaddr=10.0.0.9' (decodificado)
  • O que continua valendo nas duas versões: o ?hostaddr= não vira query e o host não muda. O invariante "o campo database não redireciona o peer via query" se mantém.
  • O que mudou: a 2.1 percent-decodifica o componente do banco e entrega o nome cru (com ?, =) ao driver, onde a 2.0 o entregava ainda codificado.
  • O que NÃO foi verificado: se algum driver usado aqui (psycopg2/psycopg, pg8000, etc.) trata = ou espaço em dbname como string de conexão (libpq expand_dbname). Isso decide se há risco real ou só mudança de representação. Tratar como hipótese a verificar, não como vulnerabilidade confirmada.

2. pylock.toml fora de sincronia

O Dependabot atualiza uv.lock e requirements.txt, mas não regenera pylock.toml. Falham test_requirements_txt_matches_uv_export, test_pylock_toml_matches_uv_export e o hook dependency-artifacts-sync do lint. O job Regenerate requirements.txt da própria PR também falha.

3. O que mais está nos 42

Sem downgrade e sem pacote removido. 2 pacotes novos (opentelemetry-exporter-http-transport, opentelemetry-exporter-otlp-common, 0.66b0) e 7 opentelemetry-* 0.65b0 → 0.66b0 (a main já estava em série beta). Inclui fastapi 0.141.1 → 0.142.2, gitpython 3.1.62 → 3.2.0, snowflake-connector-python 4.7.4 → 4.8.0 (estável).

Opções (decisão do operador)

  • A. Manter sqlalchemy>=2.0,<2.1 (constraint no pyproject.toml ou ignore do Dependabot para a 2.1) e mergear o resto do grupo depois de regenerar pylock.toml.
  • B. Aceitar a 2.1: verificar o comportamento com os drivers reais, adaptar o teste ao novo contrato (nome decodificado) somente se o driver não interpretar =/espaço em dbname, e decidir se o quote() do repo continua necessário.

Aceite

  • Verificação explícita do driver (psycopg2/psycopg/pg8000) sobre dbname com = e espaço, com resultado documentado aqui.
  • pylock.toml e requirements.txt regenerados e consistentes com o uv.lock.
  • Nenhum teste de segurança enfraquecido para ficar verde.

Relacionadas: #2062, #2060, #2059.

Activity

  1. FabioLeitao commented on Oct 12, 2026

    @FabioLeitao
    CollaboratorAuthor

    Decisão do operador, relatada por Claude via chat (2026-10-12 09:36 -03)

    Não é assinatura do operador no GitHub: é o registro, feito por Claude, da mensagem dele no chat. Texto dele: "Aceito atualizado do sqlalchemy".

    Leitura: opção B (aceitar sqlalchemy 2.1.x; não segurar <2.1). Condições que continuam valendo, do próprio aceite desta issue:

    • Verificar com os drivers reais (psycopg2/psycopg/pg8000) o que acontece com dbname contendo = e espaço (audit hostaddr=10.0.0.9), e documentar o resultado.
    • Se algum driver interpretar dbname como conninfo, a correção é validar/rejeitar esse nome no repo (fail-closed), não relaxar o teste.
    • Nenhum teste de segurança enfraquecido para ficar verde.
    • Regenerar pylock.toml e requirements.txt a partir do uv.lock.

    Execução: reparo no lugar na branch da #2062 (nunca fechar sem merge), local primeiro; push só com go explícito.

    🤖 Claude (Sonnet 5.5), tom recomendatório.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions