CVE-2022-31113: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') (CWE-79)
value: Canarytokens is an open source tool which helps track activity and actions on your network. A Cross-Site Scripting vulnerability was identified in the history page of triggered Canarytokens. This permits an attacker who recognised an HTTP-based Canarytoken (a URL) to execute Javascript in the Canarytoken's history page (domain: canarytokens.org) when the history page is later visited by the Canarytoken's creator. This vulnerability could be used to disable or delete the affected Canarytoken, or view its activation history. It might also be used as a stepping stone towards revealing more information about the Canarytoken's creator to the attacker. For example, an attacker could recover the email address tied to the Canarytoken, or place Javascript on the history page that redirect the creator towards an attacker-controlled Canarytoken to show the creator's network location. An attacker could only act on the discovered Canarytoken. This issue did not expose other Canarytokens or other Canarytoken creators. The issue has been patched on Canarytokens.org and in the latest release. No signs of successful exploitation of this vulnerability have been found. Users are advised to upgrade. There are no known workarounds for this issue.
CWE description: The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
CVSS v3 base score: 6.1
Published: 2022-07-01T17:15Z
Repository: https://github.com/thinkst/canarytokens
Language: HTML
Files changed: templates/history.html
Commit date: 2022-06-30 11:52:35 +0200
Commit message: Fix XSS reported by Yohann / @2xyo

Diff: diff --git a/templates/history.html b/templates/history.html
index 67b15a4..a61b452 100644
--- a/templates/history.html
+++ b/templates/history.html
@@ -304,11 +304,11 @@
                     <col width="25%">
                     <col width="75%">
     {% for info in canarydrop['triggered_list'][item]['additional_info'] %}
                     <tr class="header_row">
                        <td colspan="2">
-                         {{info}}
+                         {{info|e}}
                        </td>
                     </tr>
       {%if info == 'iOS-App'%}
                       <script type="text/javascript">
                         appendGeoInfo("{{item}}",{{canarydrop['triggered_list'][item]['additional_info'][info]}})
@@ -351,11 +351,11 @@
                             {{info_item}}
                           </td>
                           <td>
                             {{ canarydrop['triggered_list'][item]['additional_info'][info][info_item][0] == '1'
                                   if info_item in ['enabled','installed']
-                                  else canarydrop['triggered_list'][item]['additional_info'][info][info_item]|join(', ') }}
+                                  else canarydrop['triggered_list'][item]['additional_info'][info][info_item]|join(', ')|e }}
                           </td>
                         </tr>
       {% endfor %}
     {% endfor %}
                   </table>

Vulnerable code:                          {{info}}
                                  else canarydrop['triggered_list'][item]['additional_info'][info][info_item]|join(', ') }}
Fixed code:                          {{info|e}}
                                  else canarydrop['triggered_list'][item]['additional_info'][info][info_item]|join(', ')|e }}