CVE-2024-36105 (published 2024-05-27T18:15Z)

dbt enables data analysts and engineers to transform their data using the same practices that software engineers use to build applications. Prior to versions 1.6.15, 1.7.15, and 1.8.1, Binding to `INADDR_ANY (0.0.0.0)` or `IN6ADDR_ANY (::)` exposes an application on all network interfaces, increasing the risk of unauthorized access. As stated in the Python docs, a special form for address is accepted instead of a host address: `\'\'` represents `INADDR_ANY`, equivalent to `"0.0.0.0"`. On systems with IPv6, \'\' represents `IN6ADDR_ANY`, which is equivalent to `"::"`. A user who serves docs on an unsecured public network, may unknowingly be hosting an unsecured (http) web site for any remote user/system to access on the same network. The issue has has been mitigated in dbt-core v1.6.15, dbt-core v1.7.15, and dbt-core v1.8.1 by binding to localhost explicitly by default in `dbt docs serve`.\n


Weakness information:
cwe_id: NVD-CWE-noinfo
cwe_name: Insufficient Information
description: There is insufficient information about the issue to classify it; details are unkown or unspecified.
extended_description: Insufficient Information

Fix information:
repo_url: https://github.com/dbt-labs/dbt-core
commit_details: repo_url: https://github.com/dbt-labs/dbt-core
author: Michelle Ark
author_date: 2024-05-22 10:00:54-04:00
msg: change port bind and add a unittest (#10208)
repository: repo_url: https://github.com/dbt-labs/dbt-core
repo_name: dbt-labs/dbt-core
description: dbt enables data analysts and engineers to transform their data using the same practices that software engineers use to build applications.
repo_language: Python
owner: dbt-labs
file_changes: filename: Security-20240522-094540.yaml
change_type: ModificationType.ADD
diff: @@ -0,0 +1,6 @@
+kind: Security
+body: Explicitly bind to localhost in docs serve
+time: 2024-05-22T09:45:40.748185-04:00
+custom:
+  Author: ChenyuLInx michelleark
+  Issue: "10209"

programming_language: Markdown
filename: serve.py
change_type: ModificationType.MODIFY
diff: @@ -20,7 +20,7 @@ class ServeTask(ConfiguredTask):
         if self.args.browser:
             webbrowser.open_new_tab(f"http://localhost:{port}")
 
-        with socketserver.TCPServer(("", port), SimpleHTTPRequestHandler) as httpd:
+        with socketserver.TCPServer(("127.0.0.1", port), SimpleHTTPRequestHandler) as httpd:
             click.echo(f"Serving docs at {port}")
             click.echo(f"To access from your browser, navigate to: http://localhost:{port}")
             click.echo("\n\n")

programming_language: Python
filename: test_serve.py
change_type: ModificationType.ADD
diff: @@ -0,0 +1,23 @@
+from http.server import SimpleHTTPRequestHandler
+from unittest.mock import MagicMock, patch
+
+import pytest
+
+from dbt.task.docs.serve import ServeTask
+
+
+@pytest.fixture
+def serve_task():
+    # Set up
+    task = ServeTask(config=MagicMock(), args=MagicMock())
+    task.config.project_target_path = "."
+    task.args.port = 8000
+    return task
+
+
+def test_serve_bind_to_127(serve_task):
+    serve_task.args.browser = False
+    with patch("dbt.task.docs.serve.socketserver.TCPServer") as patched_TCPServer:
+        patched_TCPServer.return_value = MagicMock()
+        serve_task.run()
+        patched_TCPServer.assert_called_once_with(("127.0.0.1", 8000), SimpleHTTPRequestHandler)

programming_language: Python