{"id":"CVE-2024-0243","aliases":["EUVD-2024-0652","GHSA-h9j7-5xvc-qhg5","PYSEC-2024-235","PYSEC-2026-1509"],"status":"published","title":"Server-side Request Forgery In Recursive URL Loader","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","severity":{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00517,"percentile":0.44309,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-918"],"published":"2024-02-24T17:59:26Z","modified":"2026-10-28T02:30:24Z","fixes":[{"ecosystem":"PyPI","package":"langchain","fixed_in":["0.1.0"],"sources":["ghsa","osv"]},{"ecosystem":"PyPI","package":"langchain-exa","fixed_in":["0.1.0"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"langchain","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.1.0"}]}]},{"source":"osv","ecosystem":"PyPI","package":"langchain","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.1.0"}]}],"versions":["0.0.1","0.0.10","0.0.100","0.0.101","0.0.101rc0","0.0.102","0.0.102rc0","0.0.103","0.0.104","0.0.105","0.0.106","0.0.107","0.0.108","0.0.109","0.0.11","0.0.110","0.0.111","0.0.112","0.0.113","0.0.114","0.0.115","0.0.116","0.0.117","0.0.118","0.0.119","0.0.12","0.0.120","0.0.121","0.0.122","0.0.123","0.0.124","0.0.125","0.0.126","0.0.127","0.0.128","0.0.129","0.0.13","0.0.130","0.0.131","0.0.132","0.0.133","0.0.134","0.0.135","0.0.136","0.0.137","0.0.138","0.0.139","0.0.14","0.0.140","0.0.141","0.0.142","0.0.143","0.0.144","0.0.145","0.0.146","0.0.147","0.0.148","0.0.149","0.0.15","0.0.150","0.0.151","0.0.152","0.0.153","0.0.154","0.0.155","0.0.156","0.0.157","0.0.158","0.0.159","0.0.16","0.0.160","0.0.161","0.0.162","0.0.163","0.0.164","0.0.165","0.0.166","0.0.167","0.0.168","0.0.169","0.0.17","0.0.170","0.0.171","0.0.172","0.0.173","0.0.174","0.0.175","0.0.176","0.0.177","0.0.178","0.0.179","0.0.18","0.0.180","0.0.181","0.0.182","0.0.183","0.0.184","0.0.185","0.0.186","0.0.187","0.0.188","0.0.189","0.0.19","0.0.190","0.0.191","0.0.192","0.0.193","0.0.194","0.0.195","0.0.196","0.0.197","0.0.198","0.0.199","0.0.2","0.0.20","0.0.200","0.0.201","0.0.202","0.0.203","0.0.204","0.0.205","0.0.206","0.0.207","0.0.208","0.0.209","0.0.21","0.0.210","0.0.211","0.0.212","0.0.213","0.0.214","0.0.215","0.0.216","0.0.217","0.0.218","0.0.219","0.0.22","0.0.220","0.0.221","0.0.222","0.0.223","0.0.224","0.0.225","0.0.226","0.0.227","0.0.228","0.0.229","0.0.23","0.0.230","0.0.231","0.0.232","0.0.233","0.0.234","0.0.235","0.0.236","0.0.237","0.0.238","0.0.239","0.0.24","0.0.240","0.0.240rc0","0.0.240rc1","0.0.240rc4","0.0.242","0.0.243","0.0.244","0.0.245","0.0.246","0.0.247","0.0.248","0.0.249","0.0.25","0.0.250","0.0.251","0.0.252","0.0.253","0.0.254","0.0.255","0.0.256","0.0.257","0.0.258","0.0.259","0.0.26","0.0.260","0.0.261","0.0.262","0.0.263","0.0.264","0.0.265","0.0.266","0.0.267","0.0.268","0.0.269","0.0.27","0.0.270","0.0.271","0.0.272","0.0.273","0.0.274","0.0.275","0.0.276","0.0.277","0.0.278","0.0.279","0.0.28","0.0.281","0.0.283","0.0.284","0.0.285","0.0.286","0.0.287","0.0.288","0.0.289","0.0.29","0.0.290","0.0.291","0.0.292","0.0.293","0.0.294","0.0.295","0.0.296","0.0.297","0.0.298","0.0.299","0.0.3","0.0.30","0.0.300","0.0.301","0.0.302","0.0.303","0.0.304","0.0.305","0.0.306","0.0.307","0.0.308","0.0.309","0.0.31","0.0.310","0.0.311","0.0.312","0.0.313","0.0.314","0.0.315","0.0.316","0.0.317","0.0.318","0.0.319","0.0.32","0.0.320","0.0.321","0.0.322","0.0.323","0.0.324","0.0.325","0.0.326","0.0.327","0.0.329","0.0.33","0.0.330","0.0.331","0.0.331rc0","0.0.331rc1","0.0.331rc2","0.0.331rc3","0.0.332","0.0.333","0.0.334","0.0.335","0.0.336","0.0.337","0.0.338","0.0.339","0.0.339rc0","0.0.339rc1","0.0.339rc2","0.0.339rc3","0.0.34","0.0.340","0.0.341","0.0.342","0.0.343","0.0.344","0.0.345","0.0.346","0.0.347","0.0.348","0.0.349","0.0.349rc1","0.0.349rc2","0.0.35","0.0.350","0.0.351","0.0.352","0.0.353","0.0.354","0.0.36","0.0.37","0.0.38","0.0.39","0.0.4","0.0.40","0.0.41","0.0.42","0.0.43","0.0.44","0.0.45","0.0.46","0.0.47","0.0.48","0.0.49","0.0.5","0.0.50","0.0.51","0.0.52","0.0.53","0.0.54","0.0.55","0.0.56","0.0.57","0.0.58","0.0.59","0.0.6","0.0.60","0.0.61","0.0.63","0.0.64","0.0.65","0.0.66","0.0.67","0.0.68","0.0.69","0.0.7","0.0.70","0.0.71","0.0.72","0.0.73","0.0.74","0.0.75","0.0.76","0.0.77","0.0.78","0.0.79","0.0.8","0.0.80","0.0.81","0.0.82","0.0.83","0.0.84","0.0.85","0.0.86","0.0.87","0.0.88","0.0.89","0.0.9","0.0.90","0.0.91","0.0.92","0.0.93","0.0.94","0.0.95","0.0.96","0.0.97","0.0.98","0.0.99","0.0.99rc0"]},{"source":"osv","ecosystem":"PyPI","package":"langchain-exa","ranges":[{"type":"GIT","events":[{"introduced":"0"},{"fixed":"bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22"},{"fixed":"bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22"}]},{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.1.0"}]}],"versions":["0.0.1"]},{"source":"osv","ecosystem":"PyPI","package":"langchain","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.1.0"}]}],"versions":["0.0.1","0.0.10","0.0.100","0.0.101","0.0.101rc0","0.0.102","0.0.102rc0","0.0.103","0.0.104","0.0.105","0.0.106","0.0.107","0.0.108","0.0.109","0.0.11","0.0.110","0.0.111","0.0.112","0.0.113","0.0.114","0.0.115","0.0.116","0.0.117","0.0.118","0.0.119","0.0.12","0.0.120","0.0.121","0.0.122","0.0.123","0.0.124","0.0.125","0.0.126","0.0.127","0.0.128","0.0.129","0.0.13","0.0.130","0.0.131","0.0.132","0.0.133","0.0.134","0.0.135","0.0.136","0.0.137","0.0.138","0.0.139","0.0.14","0.0.140","0.0.141","0.0.142","0.0.143","0.0.144","0.0.145","0.0.146","0.0.147","0.0.148","0.0.149","0.0.15","0.0.150","0.0.151","0.0.152","0.0.153","0.0.154","0.0.155","0.0.156","0.0.157","0.0.158","0.0.159","0.0.16","0.0.160","0.0.161","0.0.162","0.0.163","0.0.164","0.0.165","0.0.166","0.0.167","0.0.168","0.0.169","0.0.17","0.0.170","0.0.171","0.0.172","0.0.173","0.0.174","0.0.175","0.0.176","0.0.177","0.0.178","0.0.179","0.0.18","0.0.180","0.0.181","0.0.182","0.0.183","0.0.184","0.0.185","0.0.186","0.0.187","0.0.188","0.0.189","0.0.19","0.0.190","0.0.191","0.0.192","0.0.193","0.0.194","0.0.195","0.0.196","0.0.197","0.0.198","0.0.199","0.0.2","0.0.20","0.0.200","0.0.201","0.0.202","0.0.203","0.0.204","0.0.205","0.0.206","0.0.207","0.0.208","0.0.209","0.0.21","0.0.210","0.0.211","0.0.212","0.0.213","0.0.214","0.0.215","0.0.216","0.0.217","0.0.218","0.0.219","0.0.22","0.0.220","0.0.221","0.0.222","0.0.223","0.0.224","0.0.225","0.0.226","0.0.227","0.0.228","0.0.229","0.0.23","0.0.230","0.0.231","0.0.232","0.0.233","0.0.234","0.0.235","0.0.236","0.0.237","0.0.238","0.0.239","0.0.24","0.0.240","0.0.240rc0","0.0.240rc1","0.0.240rc4","0.0.242","0.0.243","0.0.244","0.0.245","0.0.246","0.0.247","0.0.248","0.0.249","0.0.25","0.0.250","0.0.251","0.0.252","0.0.253","0.0.254","0.0.255","0.0.256","0.0.257","0.0.258","0.0.259","0.0.26","0.0.260","0.0.261","0.0.262","0.0.263","0.0.264","0.0.265","0.0.266","0.0.267","0.0.268","0.0.269","0.0.27","0.0.270","0.0.271","0.0.272","0.0.273","0.0.274","0.0.275","0.0.276","0.0.277","0.0.278","0.0.279","0.0.28","0.0.281","0.0.283","0.0.284","0.0.285","0.0.286","0.0.287","0.0.288","0.0.289","0.0.29","0.0.290","0.0.291","0.0.292","0.0.293","0.0.294","0.0.295","0.0.296","0.0.297","0.0.298","0.0.299","0.0.3","0.0.30","0.0.300","0.0.301","0.0.302","0.0.303","0.0.304","0.0.305","0.0.306","0.0.307","0.0.308","0.0.309","0.0.31","0.0.310","0.0.311","0.0.312","0.0.313","0.0.314","0.0.315","0.0.316","0.0.317","0.0.318","0.0.319","0.0.32","0.0.320","0.0.321","0.0.322","0.0.323","0.0.324","0.0.325","0.0.326","0.0.327","0.0.329","0.0.33","0.0.330","0.0.331","0.0.331rc0","0.0.331rc1","0.0.331rc2","0.0.331rc3","0.0.332","0.0.333","0.0.334","0.0.335","0.0.336","0.0.337","0.0.338","0.0.339","0.0.339rc0","0.0.339rc1","0.0.339rc2","0.0.339rc3","0.0.34","0.0.340","0.0.341","0.0.342","0.0.343","0.0.344","0.0.345","0.0.346","0.0.347","0.0.348","0.0.349","0.0.349rc1","0.0.349rc2","0.0.35","0.0.350","0.0.351","0.0.352","0.0.353","0.0.354","0.0.36","0.0.37","0.0.38","0.0.39","0.0.4","0.0.40","0.0.41","0.0.42","0.0.43","0.0.44","0.0.45","0.0.46","0.0.47","0.0.48","0.0.49","0.0.5","0.0.50","0.0.51","0.0.52","0.0.53","0.0.54","0.0.55","0.0.56","0.0.57","0.0.58","0.0.59","0.0.6","0.0.60","0.0.61","0.0.63","0.0.64","0.0.65","0.0.66","0.0.67","0.0.68","0.0.69","0.0.7","0.0.70","0.0.71","0.0.72","0.0.73","0.0.74","0.0.75","0.0.76","0.0.77","0.0.78","0.0.79","0.0.8","0.0.80","0.0.81","0.0.82","0.0.83","0.0.84","0.0.85","0.0.86","0.0.87","0.0.88","0.0.89","0.0.9","0.0.90","0.0.91","0.0.92","0.0.93","0.0.94","0.0.95","0.0.96","0.0.97","0.0.98","0.0.99","0.0.99rc0"]}],"products":[{"vendor":"langchain","product":"langchain"},{"vendor":"langchain-ai","product":"langchain-ai/langchain"},{"vendor":"langchain-ai","product":"langchain-ai\\/langchain"}],"references":[{"url":"https://huntr.com/bounties/370904e7-10ac-40a4-a8d4-e2d16e1ca861","tags":["x_transferred","Exploit","Issue Tracking","Third Party Advisory","web"]},{"url":"https://github.com/langchain-ai/langchain/commit/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22","tags":["x_transferred","Patch","fix","web"]},{"url":"https://github.com/langchain-ai/langchain/pull/15559","tags":["x_transferred","Issue Tracking","Patch","fix","web","report"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2024-0243","tags":["advisory"]},{"url":"https://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51","tags":["web"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/langchain-exa/PYSEC-2024-235.yaml","tags":["web"]},{"url":"https://github.com/advisories/GHSA-h9j7-5xvc-qhg5","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/0xxx/CVE-2024-0243.json","tags":["advisory"]},{"url":"https://github.com/langchain-ai/langchain","tags":["package"]},{"url":"https://pypi.org/project/langchain","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2024-0243","title":"Server-side Request Forgery In Recursive URL Loader","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-24T17:59:26.498Z","modified":"2025-04-22T16:14:26.674Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low","assessor":"cna"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T14:34:22.852179Z"}],"euvd":[{"id":"EUVD-2024-0652","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-24T17:59:26Z","modified":"2025-04-22T16:14:26Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low"}],"updated_at":"2026-11-02T20:52:16.055056Z"}],"ghsa":[{"id":"GHSA-h9j7-5xvc-qhg5","title":"langchain Server-Side Request Forgery vulnerability","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text \n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-26T18:30:29Z","modified":"2026-03-17T05:03:18Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T14:39:36.642723Z"}],"nvd":[{"id":"CVE-2024-0243","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-26T16:27:49.67Z","modified":"2026-06-17T06:53:04.443Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"},{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low","assessor":"secondary"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T14:09:37.655131Z"}],"osv":[{"id":"CVE-2024-0243","title":"Server-side Request Forgery In Recursive URL Loader","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-24T17:59:26.498Z","modified":"2026-10-28T02:30:24.918519886Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T15:44:37.180532Z"},{"id":"GHSA-h9j7-5xvc-qhg5","title":"langchain Server-Side Request Forgery vulnerability","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text \n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-26T18:30:29Z","modified":"2026-07-07T17:56:41.991383859Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T15:46:48.920784Z"},{"id":"PYSEC-2024-235","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text\n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2024-02-26T16:27:49Z","modified":"2026-07-07T17:56:41.991383859Z","cvss":[{"version":"3.1","score":8.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:52:54.242332Z"},{"id":"PYSEC-2026-1509","title":"langchain Server-Side Request Forgery vulnerability","description":"With the following crawler configuration:\n\n```python\nfrom bs4 import BeautifulSoup as Soup\n\nurl = \"https://example.com\"\nloader = RecursiveUrlLoader(\n    url=url, max_depth=2, extractor=lambda x: Soup(x, \"html.parser\").text \n)\ndocs = loader.load()\n```\n\nAn attacker in control of the contents of `https://example.com` could place a malicious HTML file in there with links like \"https://example.completely.different/my_file.html\" and the crawler would proceed to download that file as well even though `prevent_outside=True`.\n\nhttps://github.com/langchain-ai/langchain/blob/bf0b3cc0b5ade1fb95a5b1b6fa260e99064c2e22/libs/community/langchain_community/document_loaders/recursive_url_loader.py#L51-L51\n\nResolved in https://github.com/langchain-ai/langchain/pull/15559","status":"published","published":"2026-07-07T11:45:32.931836Z","modified":"2026-07-07T17:56:41.991383859Z","cvss":[{"version":"3.0","score":3.7,"vector":"CVSS:3.0/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:L/A:N","level":"low"}],"updated_at":"2026-11-02T15:52:55.06457Z"}]}}
