other
Warning
- Location
- scripts/update_linkedin.py:69
- Finding
- Odoo Contact PII Disclosed to an External Search Provider<![CDATA[ ## Vulnerability Details **File Location**: `scripts/update_linkedin.py`, lines 8–11 and 69–73 **Vulnerability Type**: External disclosure of personal data **Risk Level**: Medium ### Complete Code Snippet ```python def get_linkedin_url(query): url = 'https://html.duckduckgo.com/html/' data = urllib.parse.urlencode({'q': query}).encode('utf-8') req = urllib.request.Request(url, data=data, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}) try: html = urllib.request.urlopen(req).read().decode('utf-8') ``` ```python name = partner.get('name', '') company_name = '' if partner.get('parent_id'): # parent_id is usually a list: [id, display_name] company_name = partner['parent_id'][1] search_query = f"site:linkedin.com/in {name} {company_name}".strip() print(f"Searching for: {search_query}") linkedin_url = get_linkedin_url(search_query) ``` ### Technical Analysis The script reads a contact's name and associated company from Odoo, embeds both values in a search query, and transmits that query to `html.duckduckgo.com`. These values can constitute personal or commercially sensitive information. The external search is documented in `SKILL.md` and supports the Skill's declared purpose, so there is no evidence of covert credential exfiltration. Odoo credentials are not included in the DuckDuckGo request. However, the script performs the disclosure automatically without an explicit confirmation step, configurable privacy policy, or data-minimization control. The disclosure is necessary only for the selected public-search implementation, not inherently for updating an Odoo field. Deployments subject to privacy, confidentiality, data-residency, or third-party processing restrictions may therefore consider this behavior excessive. ### Attack Path 1. A user or agent invokes the script with an Odoo contact ID. 2. The script authenticates to Odoo using credentials from environment variables. 3. It reads the con ...[truncated 766 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Require explicit user confirmation before transmitting Odoo contact data to an external search provider. 2. Clearly identify the destination and the exact fields that will be disclosed. 3. Minimize submitted data; omit the company name unless it is needed to disambiguate the contact. 4. Support an organization-approved or privately hosted search service. 5. Add a configuration option that disables external lookup and permits a user-supplied LinkedIn URL instead. 6. Document applicable retention, privacy, and data-residency considerations. 7. Avoid logging the complete query when logs may be accessible to parties that should not receive contact data. ]]>
