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

AuswirkungDetails
VerfügbarkeitBereich: Verfügbarkeit

Denial of Service durch verstärkten Verkehr wenn Dienst allen Netzwerken ausgesetzt ist.
VertraulichkeitBereich: 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

  1. MITRE Corporation. "CWE-1327: Binding to an Unrestricted IP Address." https://cwe.mitre.org/data/definitions/1327.html
  2. OWASP. "Network Security Cheat Sheet"
  3. Docker. "Networking Best Practices"