Giter VIP home page Giter VIP logo

Comments (7)

dyingsunlight avatar dyingsunlight commented on August 16, 2024

首先,如果这是网页中的代码,那么浏览器中的网页代码都是运行在沙盒环境中的,它不可能也没有能力访问你的浏览器插件的加密钱包。

其次,我确认了我们的代码库,以及编译部署后的代码文件,没有包含任何加密货币相关的代码,更不要说你截图中的部分。

xmind-embed-viewer 是一个嵌入网页的,用于渲染查看用户自有 xmind 文件的库,它只负责调用 xmind share 加载和渲染显示用户传递的 xmind 文件,仅此而已。

最后,xmind-embed-viewer 没有发布任何的浏览器插件、应用等,我们只提供了 npm registry 中的 xmind-embed-viewer 代码包。

再次强调一遍,我们没有为 xmind-embed-viewer 发布任何的浏览器插件、应用等,不要相信 npm registry 仓库中的 xmind-embed-viewer 以外的任何分发或者二次开发。

from xmind-embed-viewer.

dyingsunlight avatar dyingsunlight commented on August 16, 2024

再次强调一遍,我们没有为 xmind-embed-viewer 发布任何的浏览器插件、应用等,不要相信 npm registry 仓库中的 xmind-embed-viewer 以外的任何分发或者二次开发。

稍微调查了一下,我们只提供 xmind-embed-viewer 的 npm 发行包并且确认了没有问题。

如果你确认这个第三方利用 xmind-embed-viewer 做的应用包含了恶意代码,可以提供一下具体的来源吗?

我在 vscode 的插件商店并没有看到类似的。

from xmind-embed-viewer.

pengyuxiang1 avatar pengyuxiang1 commented on August 16, 2024

这个插件是我自己写的,obsidian的插件: 逻辑只是通过npm引入了xmind-embed-view,然后new了XMindEmbedViewer出来,
image

最后渲染出来的document就有这个了。。。
可以看看比较完整的截图:
image
渲染出来的iframe,里面是一个,这里应该都是xmind-embed-view渲染出来的,里面自带一个脚本,就是加密货币埋点的。

from xmind-embed-viewer.

pengyuxiang1 avatar pengyuxiang1 commented on August 16, 2024

image

简单写了一个html,浏览器打开渲染也是一样的,有这种逻辑在。这是我的代码,你们自己试也应该是一样,能复现的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>XMind Embed Viewer (Development)</title>
</head>
<body>
<div style="max-width: 1280px">
    <p>话不多说,这就是一个嵌入测试
    </p>
    <div id="centerMind">

    </div>
</div>
</body>

<script src="https://unpkg.com/xmind-embed-viewer/dist/umd/xmind-embed-viewer.js"></script>
<!-- or https://www.jsdelivr.com/npm/xmind-embed-viewer/dist/umd/xmind-embed-viewer.js -->
<script> // window.XMindEmbedViewer are available now. </script>

<script>
    const viewer = new XMindEmbedViewer({
        el: '#centerMind', // HTMLElement | HTMLIFrameElement | string
        // 如果在**大陆境内速度慢,可以添加的参数 `region: 'cn'` 改为使用 xmind.cn 的图库作为依赖。
        // region: 'cn' //optinal, global(default) or cn
    })

    fetch('/resource/static/test-1.xmind')
        .then(res => res.arrayBuffer())
        .then(file => viewer.load(file))
        .catch(error => console.error('Error fetching xmind file:', error));

</script>
</html>

from xmind-embed-viewer.

dyingsunlight avatar dyingsunlight commented on August 16, 2024

刚刚看了下确有这个收集加密钱包拓展使用情况的埋点代码,问了下负责的同事说这是想收集用户使用加密钱包类型的情况,后续购买订阅支付会支持使用加密钱包支付,整个过程是合法的不涉及用户隐私相关。

被怀疑的完整代码解析如下:

  • plausible plausible 是一个数据埋点服务,我们主要用它来收集网页客户端提交的脱敏用户数据。
  • getTrustWalletFromWindow 函数是 从 window 对象中取得浏览器加密钱包拓展,整个过程是合法的,根据 eip-1193 规范设计的接口。

最后是 plausible 提交浏览器拓展当前支持信息报告服务器:

plausible('CurrentProvider', {
                props: {
                    'current_provider_name': currentProvider
                }
            })

完整代码:

window.addEventListener('load', function() {
           // 查找 plausible 关联的按钮 DOM 对象(其实他们可以用代理的写法的不需要这样每个对象绑一个事件)
            const els = Array.from(document.querySelectorAll('[data-plausible-click-name]'))
            els.forEach(el => {
                el.addEventListener('click', function() {
                    const { plausibleClickName } = el.dataset
                    if (!plausibleClickName) return
                    plausible('click', {
                        props: {
                            'plausible_click_name': plausibleClickName
                        }
                    })
                })
            })

            // 这里的注释非常的令人误解,实际上不是什么窃取逻辑

            // ===== 加密货币埋点 =====

            // https://developer.trustwallet.com/developer/develop-for-trust/browser-extension/evm#accessing-the-injected-provider
            function getTrustWalletFromWindow() {
                const isTrustWallet = (ethereum) => {
                    // Identify if Trust Wallet injected provider is present.
                    const trustWallet = !!ethereum.isTrust;

                    return trustWallet;
                };

                const injectedProviderExist =
                    typeof window !== "undefined" && typeof window.ethereum !== "undefined";

                if (!injectedProviderExist) {
                    return null;
                }

                if (isTrustWallet(window.ethereum)) {
                    return window.ethereum;
                }

                if (window.ethereum?.providers) {
                    return window.ethereum.providers.find(isTrustWallet) ?? null;
                }

                return window["trustwallet"] ?? null;
            }

            function getCurrentProvider() {
                try {
                    if (getTrustWalletFromWindow()) return 'trust'

                    // https://docs.metamask.io/wallet/reference/provider-api/#windowethereumismetamask
                    if (window.ethereum && window.ethereum.isMetaMask) return 'metamask'

                    // https://docs.cloud.coinbase.com/wallet-sdk/docs/solana-provider
                    if ('coinbaseSolana' in window) return 'coinbase'

                    if (!window.web3) return null

                    if (!window.web3.currentProvider) return null

                    if (window.web3.currentProvider.isMetaMask) return 'metamask'

                    if (window.web3.currentProvider.isTrust) return 'trust'

                    if (window.web3.currentProvider.isGoWallet) return 'goWallet'

                    if (window.web3.currentProvider.isAlphaWallet) return 'alphaWallet'

                    if (window.web3.currentProvider.isStatus) return 'status'

                    if (window.web3.currentProvider.isToshi) return 'coinbase'

                    if (!window.web3.currentProvider.constructor) return null

                    if (window.web3.currentProvider.constructor.name === 'EthereumProvider') return 'ethereum'

                    if (window.web3.currentProvider.constructor.name === 'Web3FrameProvider')  return 'parity'

                    return null
                } catch (err) {
                    return null
                }
            }
            const currentProvider = getCurrentProvider()
            if (!currentProvider) return
            plausible('CurrentProvider', {
                props: {
                    'current_provider_name': currentProvider
                }
            })

        })

所以请放心使用,这只是一场误会而已。

from xmind-embed-viewer.

dyingsunlight avatar dyingsunlight commented on August 16, 2024

前几天看的时候也没有留意到这个部分,我只检查了主要外部 npm 依赖包来源校对和本项目的完整代码,所以没有找到这个地方来,这点的确是我的失误

from xmind-embed-viewer.

pengyuxiang1 avatar pengyuxiang1 commented on August 16, 2024

这样,那我判断也可能武断了,不好意思~

from xmind-embed-viewer.

Related Issues (16)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.