Invalid access tokens crash ODBC driver - need defensive validation
Mantenedores costumam responder em até 1 dia
@bewithgaurav já está trabalhando nisso.
Desde 6/10/2025.
- #279 de @bewithgaurav — fechado sem integrar
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Describe the bug
The ODBC driver crashes with segmentation fault (macOS) or access violation (Windows) when SQL_COPT_SS_ACCESS_TOKEN (attribute 1256) is set with invalid token data via attrs_before parameter. The driver does not handle these cases gracefully, causing the Python process to crash.
This is replicable in pyodbc as well, indicating it's an underlying ODBC driver bug that we need to defend against.
Exception details:
macOS:
2025-10-06 16:00:07,377 - DEBUG - connection.py - [DDBC Bindings log] Connection string buffer created
zsh: segmentation fault python main.py
Windows:
Windows fatal exception: access violation
Current thread 0x000029c8 (most recent call first):
File "mssql_python\connection.py", line 203 in __init__
File "mssql_python\db_connection.py", line 36 in connect
File "main.py", line 22 in <module>
Stack trace shows crash originates in SQLDriverConnectW inside libmsodbcsql.18.dylib:
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_platform.dylib 0x1819e5320 _platform_memmove + 96
1 libmsodbcsql.18.dylib 0x101220000 0x101168000 + 753664
...
11 libmsodbcsql.18.dylib 0x1011c89ac SQLDriverConnectW + 2620
12 ddbc_bindings.cp313-universal2.so 0x10148c834 Connection::connect(pybind11::dict const&) + 528
To reproduce
Crash scenarios (connection string has no UID/PWD):
from mssql_python import connect
conn_str = "Driver={ODBC Driver 18 for SQL Server};Server=tcp:server.database.windows.net,1433;Database=testdb;"
# macOS: Crashes with tokens < 32 bytes
# Windows: Crashes with tokens >= 16 bytes
attrs_before = {1256: b"a" * 16}
conn = connect(conn_str, attrs_before=attrs_before)
# macOS: 32 byte token works, but further larger tokens crash
# Windows: Any token >= 16 bytes crash
attrs_before = {1256: b"x" * 64} # 64 bytes of invalid data - crashes on macOS
conn = connect(conn_str, attrs_before=attrs_before)
Platform-specific crash thresholds:
- Windows: Crashes with binary tokens with length > 15
- macOS: Crashes with binary tokens where length < 32, and also with longer malformed tokens (e.g., 64 bytes)
Expected behavior
The library should validate access token format and provide a clear error message before passing invalid data to the ODBC driver:
# Should raise a clear exception like:
# ValueError: Invalid access token format. Expected properly formatted OAuth 2.0 token.
# or
# TypeError: Access token must be bytes, not str
Rather than crashing the Python interpreter with segfault/access violation.
Further technical details
Python version: 3.13
ODBC Driver: Microsoft ODBC Driver 18 for SQL Server
Operating systems:
- macOS (segmentation fault)
- Windows (access violation)
Additional context
- This issue is also reproducible in
pyodbcfor some scenarios, confirming it's an ODBC driver bug - ODBC documentation states tokens should be formatted with zero-byte padding (UCS-2 style), but doesn't specify minimum length
- The library should implement defensive validation to prevent these crashes and provide helpful error messages
- Linguagem predominante
- Python
- Estrelas
- 479
- Forks
- 62
- Merge médio
- 2d 23h
- PRs com merge (30d)
- 18
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de microsoft/mssql-python
-
area: bulk-copy triage needed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
microsoft/mssql-python#843 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
triage needed
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 38/100
microsoft/mssql-python#850 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
triage needed
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 22/100
microsoft/mssql-python#849 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
triage needed
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 20/100
microsoft/mssql-python#848 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
macOS: encrypted connections fail after Homebrew moved the `openssl` alias to `openssl@4`Talvez já em andamento @bewithgaurav assumiu há 20 dias. Abertaarea: packaging-platform bug triage needed
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 55/100
microsoft/mssql-python#826 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
Todas as issues de microsoft/mssql-python
Issues semelhantes
-
wr.dynamodb.read_items returns [{}] for a single partition value that does not existTalvez já em andamento @auraseb assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
aws/aws-sdk-pandas#3520 ·
Mantenedores costumam responder em até 2 dias
-
requires triage typing
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
sqlalchemy/sqlalchemy#13704 ·
Mantenedores costumam responder em até 1 dia
-
Edit tool converts CRLF files to LFTalvez já em andamento @RaphaelFakhri assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
huggingface/tau#774 ·
Mantenedores costumam responder em até 1 dia
-
show ignores the row limit when a column or table name contains "limit"Talvez já em andamento @RaphaelFakhri assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
What happened to `check.py`?Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 67/100
linebender/resvg#1179 · 1 comentário ·
Mantenedores costumam responder em até 2 dias