Bindung an eine uneingeschränkte IP-Adresse
Beschreibung
Die Bindung an eine uneingeschränkte IP-Adresse tritt auf, wenn das Produkt die Adresse 0.0.0.0 einem Datenbankserver, Cloud-Dienst oder Remote-Computing-Ressource zuweist. Wenn ein Server an 0.0.0.0 bindet, erlaubt er Verbindungen von jeder IP-Adresse auf dem lokalen Rechner und macht den Server damit effektiv von jedem möglichen Netzwerk aus zugänglich. Dies erzeugt einen breiteren Zugang als Entwickler oder Administratoren typischerweise beabsichtigen und exponiert Dienste potenziell gegenüber nicht vertrauenswürdigen Netzwerken.
Risiko
Bindung an uneingeschränkte Adressen hat schwerwiegende Auswirkungen. Dienst allen Netzwerken ausgesetzt. Denial-of-Service-Verstärkung möglich. Unbefugter Zugriff aus unerwarteten Netzwerken. Interne Dienste extern exponiert. Sicherheitsgrenzen verletzt. Datenexfiltration ermöglicht. Angriffsfläche erheblich vergrößert. Netzwerksegmentierung umgangen. Hohe Ausnutzungswahrscheinlichkeit in Kombination mit anderen Schwachstellen.
Lösung
Weisen Sie während der Systemkonfigurationsphase andere IP-Adressen als 0.0.0.0 zu (hohe Wirksamkeit). Verwenden Sie Firewalls oder Paketfilter, um unerwünschte Verbindungen abzulehnen (hohe Wirksamkeit). Binden Sie an spezifische Schnittstellenadressen (127.0.0.1 für lokale Dienste, spezifische IP für kontrollierten Zugang). Dokumentieren und überprüfen Sie alle Netzwerkbindungen während Sicherheitsaudits.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Verfügbarkeit | Bereich: Verfügbarkeit Denial of Service durch verstärkten Verkehr wenn Dienst allen Netzwerken ausgesetzt ist. |
| Vertraulichkeit | Bereich: Vertraulichkeit Unbefugter Zugriff auf Dienste aus unerwarteten Netzwerken. |
Beispielcode und Lösung
Verwundbarer Code
# VERWUNDBAR: Python-Server bindet an 0.0.0.0
import socket
from http.server import HTTPServer, SimpleHTTPRequestHandler
# VERWUNDBAR: Bindet an alle Schnittstellen
def vulnerable_start_server():
host = '0.0.0.0' # VERWUNDBAR: Alle Schnittstellen
port = 8080
server = HTTPServer((host, port), SimpleHTTPRequestHandler)
print(f"Server läuft auf {host}:{port}")
server.serve_forever()
# VERWUNDBAR: Datenbankverbindung exponiert
def vulnerable_database_server():
import sqlite3
import socketserver
class DatabaseHandler(socketserver.BaseRequestHandler):
def handle(self):
pass
# VERWUNDBAR: Datenbank von allen Netzwerken zugänglich
server = socketserver.TCPServer(('0.0.0.0', 5432), DatabaseHandler)
server.serve_forever()
// VERWUNDBAR: Node.js Express-Server
const express = require('express');
const app = express();
// VERWUNDBAR: Lauscht auf allen Schnittstellen
app.listen(3000, '0.0.0.0', () => {
console.log('Server läuft auf 0.0.0.0:3000');
});
// VERWUNDBAR: Admin-Schnittstelle auf allen Schnittstellen
const adminApp = express();
adminApp.listen(9000, '0.0.0.0');
Sichere Lösung
# SICHER: Python-Server mit eingeschränkter Bindung
import socket
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
def secure_start_server():
# SICHER: Nur an localhost binden (für lokale Dienste)
host = '127.0.0.1'
port = 8080
server = HTTPServer((host, port), SimpleHTTPRequestHandler)
print(f"Server läuft auf {host}:{port}")
server.serve_forever()
def secure_start_server_specific_interface():
# SICHER: An spezifische Schnittstelle aus Konfiguration binden
host = os.environ.get('BIND_ADDRESS', '127.0.0.1')
port = int(os.environ.get('PORT', 8080))
# Bind-Adresse validieren
allowed_addresses = ['127.0.0.1', '10.0.0.5', '192.168.1.100']
if host not in allowed_addresses:
raise ValueError(f"Ungültige Bind-Adresse: {host}")
server = HTTPServer((host, port), SimpleHTTPRequestHandler)
server.serve_forever()
# SICHER: Datenbankserver nur im internen Netzwerk
def secure_database_server():
import socketserver
class DatabaseHandler(socketserver.BaseRequestHandler):
def handle(self):
pass
# SICHER: An interne Netzwerkschnittstelle binden
internal_ip = '10.0.0.5'
server = socketserver.TCPServer((internal_ip, 5432), DatabaseHandler)
server.serve_forever()
// SICHER: Node.js Express-Server mit eingeschränkter Bindung
const express = require('express');
const app = express();
// SICHER: Nur an localhost binden
app.listen(3000, '127.0.0.1', () => {
console.log('Server läuft auf 127.0.0.1:3000');
});
// SICHER: Admin-API nur auf localhost
const adminApp = express();
adminApp.listen(9000, '127.0.0.1');
// SICHER: Konfigurationsbasierte Bindung mit Validierung
function isAllowedHost(host, allowedRanges) {
if (host === '127.0.0.1' || host === 'localhost') return true;
// SICHER: 0.0.0.0 explizit ablehnen
if (host === '0.0.0.0') return false;
return allowedRanges.some(range => isInRange(host, range));
}
# SICHER: Docker-Compose-Konfiguration
version: '3'
services:
database:
image: postgres
ports:
- "127.0.0.1:5432:5432" # SICHER: Nur localhost
redis:
image: redis
# SICHER: Keine externe Port-Zuordnung
expose:
- "6379"
admin:
image: admin-panel
ports:
- "127.0.0.1:8080:8080" # SICHER: Admin nur auf localhost
CVE-Beispiele
- CVE-2022-21947: Rancher Desktop Kubernetes band Dienste an 0.0.0.0 und ermöglichte Netzwerkbenutzern unbefugten Zugriff auf die Dashboard-API.
- CVE-2020-10749: Kubernetes-Netzwerkrichtlinien-Umgehung durch Dienste, die an alle Schnittstellen gebunden waren.
Verwandte CWEs
- CWE-668: Exposure of Resource to Wrong Sphere (Eltern)
- CWE-417: Communication Channel Errors (Kategorie)
Referenzen
- MITRE Corporation. "CWE-1327: Binding to an Unrestricted IP Address." https://cwe.mitre.org/data/definitions/1327.html
- OWASP. "Network Security Cheat Sheet"
- Docker. "Networking Best Practices"