V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
phithon
V2EX  ›  云计算

由此次阿里云事件谈粗暴的安全防护手段

  phithon · 2015-09-02 19:42:13 +08:00 · 26928 次点击
这是一个创建于 3361 天前的主题,其中的信息可能已经有所发展或是发生改变。

昨天阿里连续爆出了两个有意思的事件,一是阿里云服务器出现故障,导致误删除了大量用户文件( http://www.weibo.com/1747505067/CyvEkrxPS );二是阿里承认明年校招名额将会缩减,可能导致很多已经拿到意向书的同学拿不到 offer 。

我不针对任何公司的对错发表评论,单论技术上的问题。

阿里云故障的原因,在各方说明下我也大概了解了,是云盾升级,将用户合法的可执行文件给当做恶意文件,直接给删掉了。

po 主的语气和遭遇,听起来感觉挺逗的:

enter image description here

这段话我看着笑了一下午,我斗胆猜一下云盾是怎么工作的:

为了防止服务器被入侵,并执行恶意软件(如提权程序),拥有 root 权限的 AliyunDun 英勇地负责干掉这些可恶的恶意程序。不知道为什么,最后眼瞎把正常程序也杀掉了。不,是删掉了……

直接删掉了啊尼玛!

这让我想起了很久以前刚入道时候我检测过一个网站,传上去的 webshell 总是莫名其妙地 404 了。当时感觉就是被安全软件做了手脚,后来进去一看果然,我传上去的不免杀的 webshell.asp 全被重命名成了 webshell.asp.20xx-xx-xx_xxxxxx.hws

当时感觉,这样的防御手段真是很黄很暴力啊。

因为当时的 asp 网站拿 shell ,无非是几个常见方法:一是数据库插马,二是配置文件插马,三是上传漏洞利用各种解析漏洞等。前两种方法,都是将一句话插入到其他正常文件里。这时候如果正常文件也被直接改名了,将导致整个网站都运行不了了(配置文件和数据库文件都是网站运行必不可少的文件呀)。

还好当时检测的时候是找的上传漏洞,否则网站搞挂了就悲剧了。
后来知道这个防御软件叫护卫神,好一个护卫神,真是好呵护呀。现在谷歌“护卫神 重命名”,还能找到一堆恢复误杀文件的软件:

enter image description here

当然,护卫神比起这次的阿里云盾事件来说,还是小巫见大巫了。怎么说它也没把正常文件当木马删掉,只是重命名了,还有无限恢复的可能。

说起粗暴,我还能想到的是很多开源应用。他们对于安全漏洞的惧怕与修复手段,如果不做代码审计或二次开发,大多数开发者你们可能根本不会想到。我见过无数应用,防御 SQL 注入的手段如此粗暴:

enter image description here

上图某个版本的 cmseasy 源码。光看图可能体会不深,看到具体代码:
enter image description here

居然在 codition 这种函数里直接用这么粗暴的手段处理 SQL 注入,任意 SQL 语句的 key 和 value 都不能出现 select 、 if 、 sleep 、 from 这种英语中常见的单词,那这个系统还怎么正常使用?

这就是国内很多开发者对待安全漏洞的态度:惧怕、痛恨、无能。他们用最原始最粗暴的手段去处理安全问题,根本原因是他们对安全问题处理方法一无所知,不知道怎样正确地处理漏洞。

这样的开发者我觉得还是趁早辞退了的好。

所以,这里就不得不说到,粗暴的安全防护手段造成的问题。注重安全固然是一个优点,但我们怎样去科学地注重安全?

这里涉及到几个问题:

  1. 以安全为目的的监控是否合法?
  2. 安全权限大,还是业务权限大?
  3. 发现安全问题,是告警还是自动处理?
  4. 如何科学地,而非利用原始手段去解决问题?

第一个问题,以安全为目的的监控是否合法?
我看到 V2EX 上很多朋友诟病阿里云盾的原因是,作为一个 IaaS ,云盾却一直驻于内存监控与干预系统。那么,云盾这个进程究竟在用户的 ECS 上做了些什么?

据各种不靠谱小道消息,我了解到云盾在用户的机器上权限是很大的,几乎可以做任何事情,包括监视用户的文件系统、 SQL 语句、进程等,我不以最坏的恶意揣测任何人,单只认为云盾监视这些东西的原因是防止恶意程序。但这样的监视已经让很多用户不安了。

就像美国棱镜门, NSA 一直强调自己监视民众是出自反恐等目的,但并不是说有人都逆来顺受,你的监控已经触犯到人们的隐私了。

那么,阿里云是否可以提供给用户取消云盾的选项?用户选择取消云盾后是否真的再也没有类似进程监控系统了?看下图:

enter image description here

从售后工程师处了解到,你希望的都是不可能的,呵呵~

第二个问题,安全权限大,还是业务权限大?

首先,权力不管在现实世界中,还是网络世界中,都是一个很可怕的东西。一旦高权限被用在不当的地方,带来将是灾难。

这次的事件实际上是一个错误,并不是权限被“滥用”了。但实际造成的结果是灾难性的。犯错误不可怕,可怕的是在我犯错误的同时居然刚好有高的权限,结果造成不可挽回的损失。

相信很多同学曾经都有做过 rm -rf /这类的傻事,多半是笔误手癌造成的。笔误通常是无法避免的,但试想,如果你当时并不是 root 用户,那么很多麻烦其实都不会发生。

这次云盾事件也一样,如果云盾没有删除用户文件的权限,也就不会发生这种悲剧。

所以,在做不到万无一失的情况下,就不要给自己高权限。高处不胜寒,古人的话还是很有道理。

那么,安全软件究竟要不要给予其高权限?

我个人比较喜欢的做法是,给予 WAF 进程 www 权限(附着于 web 容器中),让它作为一个语言扩展或者服务中间件扩展的形式进行流量监测与过滤。

当然你会说这样的方式监测效果不佳,或者说云盾担任的角色并不是 WAF ,而是类似 windows 操作系统中“杀毒软件”的角色,所以一定要拥有像 windows 中“ ring0 ”的权限才行。

既然你选择了 linux ,那就得接受 linux 严格的权限划分,接受它作为“服务器”的角色而不是 PC 机。 windows 下的杀毒软件在 PC 机上胡作非为,虽也是人人喊打,但影响再大也只是个人的。但服务器上如果也放任杀毒软件胡作非为,那将影响到整个生产环境的健壮性,服务的稳定,甚至整个企业的业务。

所以我认为生产环境下,不应给安全软件过高的权限,保证业务才是王道。

第三个问题,发现安全问题,是告警还是自动处理?
我曾经在某网内见过一个简单粗暴的安全检测脚本:

enter image description here

也是直接拿下关键词就报警。但这个脚本只是将具体文件、关键信息用 mutt 命令发送邮件到技术人员手中。

这就体现出一个“告警”的概念。技术人员即使自己对自己的服务十分熟悉,也不敢直接用自动化手段处理安全问题,而是选择将问题“告诉”自己。我觉得这虽然加大了人的工作量,但在你的技术还没达到 100%识别恶意脚本的情况下,人工识别仍然是最有效的办法。

阿里在国内我觉得是安全最好的企业之一,但就这次的事件来看,完全不能满足自动化解决安全问题的条件。云盾在不了解用户业务的情况下,更不应该自动化处理用户的文件和数据。

所以,相比于发现问题直接杀掉,还是告警用户,让用户自己处理更好。

这一点上,国外的 IDC 厂商做的就更好,比如 linode :

enter image description here

第四个问题,如何科学地,而非利用原始手段去解决问题?
这也是最难的一个问题了。包括我自己,还经常使用原始手段解决问题,我举个例子。

运行 wiki.leavesongs.com 的 wsgi 服务器是 gunicorn ,我早期自己写了一个原始的脚本来进行重启操作:

enter image description here
一个多么简单明了的脚本。

结果后期出了各种错误:一出错就导致服务挂掉,还经常要运行两次才能重启服务。

所以系统服务通常是不会用这类原始方法去控制的,老的 linux 上是 sysvinit , debian8 将服务管理方式从较简单的 sysvinit 替换到成 systemd ,更加体现出“科学”这个概念。

新的事物总有诞生的道理,所以我也不能去抗拒它,只有科学的工作方法才能提升生产力。

但科学的事物也有不可避免的问题,学习成本大,对人的要求很高。有些人对所谓的“学术派”嗤之以鼻,殊不知实际上是一种吃不到葡萄说葡萄酸的心理,说这些话的人大多是“野路子”。

我也是半个野路子,所以干很多事情还是用最简单的方法,当我真正在课堂上认真学习过“软件工程”、“编译原理”之类的课程以后,再用课上学过的思想去思考你做过的很多项目,发现我的很多做法有多幼稚。

现在互联网行业对人才的需求,处在一种很微妙的状态。各大企业都缺乏人才,做这块的人也很多,但实际上称得上“人才”的人不多。

我觉得人才的最低标准,也得是能够用科学的方法去处理问题。而不是你会写几个 app ,会写个网站,套用几个第三方库开发一个软件,就是人才了。(但实际上很多互联网公司招到的人多半是这一类)

这一点上我很惭愧,自己也够不到最低标准。

左耳朵耗子曾经在微博上分享过一个趣事:

enter image description here

也是一个粗暴的安全软件造成的问题。我猜这个脚本原始到只用一行代码即可写好,一个 crontab ,一个 ps ,一个 gerp 。

这样的脚本是否符合软件工程的设计理念,我不敢妄言。但就这样欠考虑的处理方式,我就觉得迟早会出大事。

一个公司使用的原始手段越少,说明这个公司的技术水平越高。“懒人创造奇迹”的懒人不是懒得学习知识的人,而是对繁杂的现状不满而选择去改变的人,如果我们连现状是怎样,原理都没了解清楚,总想用最简单的方法解决问题,那只能背下出事后的锅了。

安全越来越受到重视的同时,要科学地去面对安全,我想这个事情也是任重而道远的。阿里这种安全很强的公司都会出现这样的 BUG ,更别说很多企业可能安全团队是从零一下子出现的,人才、技术的良莠不齐也是正常现象,所以才会出现各式各样粗暴的安全防护手段。

另外,也希望的是领导者都能清晰地明白怎样真正注重安全,不逼员工去做一些“看似使业务安全”的工作,这也是减少很多荒唐安全措施的方法。

这些愿景,希望都能实现。

原文:https://www.leavesongs.com/PENETRATION/talking-about-violence-security-defense.html

56 条回复    2015-09-17 14:44:49 +08:00
yexm0
    1
yexm0  
   2015-09-02 19:53:16 +08:00
只可惜在中国 linode 就一残废.
echo1937
    2
echo1937  
   2015-09-02 20:45:21 +08:00
就和支付宝的安全控件一样,默认给你安个根证书啊,搞个进程过滤你全部系统流量啊,实质上还是思维僵化落后,技术又缺乏能力和自信,对客户的隐式缺乏尊重。
PP
    3
PP  
   2015-09-02 20:52:30 +08:00 via iPad
我更关心网上的报道是怎么被阿里巴巴干掉的。
assassinpig
    4
assassinpig  
   2015-09-02 21:00:51 +08:00
好长
Orzzzz
    5
Orzzzz  
   2015-09-02 21:05:54 +08:00
原来是你!
x4
    6
x4  
   2015-09-02 21:07:30 +08:00 via Android
再过几年咱们就是局域网了,在我朝就不存在安全问题了,啥都实名制
Orzzzz
    7
Orzzzz  
   2015-09-02 21:12:28 +08:00
@x4 另一种形式的闭关锁国。(我们自给自足,自产自销嘛~)
salmon5
    8
salmon5  
   2015-09-02 21:19:29 +08:00
谢谢!你的文章很有价值。我们也是这次阿里云问题的受害者,这个问题很严重,不知道多少运维安全人员被黑锅了。
skxs067
    9
skxs067  
   2015-09-02 21:25:40 +08:00
这篇文章写的很不错, 我能转载嘛?....我肯定会保留出处的
skxs067
    10
skxs067  
   2015-09-02 21:26:57 +08:00
@yexm0 怎么说? 我前些天买了一台 linode 最便宜的 CA 节点,到中国的速度居然始终不超过 300KB, 你指的是这个吗? 然后我退了,用的 krypt
msg7086
    11
msg7086  
   2015-09-02 21:38:54 +08:00
上电视了啊,感谢嘻嘻 TV 。

@skxs067 中国网络太残废。 linode 全球都是飞快的。
wzxjohn
    12
wzxjohn  
   2015-09-02 21:47:17 +08:00   ❤️ 2
其实云盾有一个隐藏的暴力的卸载脚本,就是把云顿的安装脚本下载链接:
http://update.aegis.aliyun.com/download/install.sh
中的 install 换成 uninstall 就可以了。。。
http://update.aegis.aliyun.com/download/uninstall.sh
其实很简单就是杀进程然后删文件。。。
Yinz
    13
Yinz  
   2015-09-02 22:01:06 +08:00
很棒的文章
laotaitai
    14
laotaitai  
   2015-09-02 22:09:29 +08:00
@wzxjohn 哇喔! 赶紧保存一份, 等不了多久, 就要被删.


另外, Livd 是不是被阿里云收买了? 好多关于阿里云的帖子都不能进去.
crll
    15
crll  
   2015-09-02 22:22:26 +08:00
@laotaitai http://help.aliyun.com/knowledge_detail/6689106.html
官方已经写出来了,不能保存。
wzxjohn
    16
wzxjohn  
   2015-09-02 23:32:16 +08:00
@crll 感觉好像是才写的?以前真没找到。。。
crll
    17
crll  
   2015-09-02 23:33:44 +08:00
@wzxjohn 嗯,我问的时候 他写的。
pierre1994
    18
pierre1994  
   2015-09-02 23:35:56 +08:00 via Android
后排围观 v2ex
canky
    19
canky  
   2015-09-03 00:19:49 +08:00 via iPhone
给楼主 108 个赞
mywaiting
    20
mywaiting  
   2015-09-03 00:38:43 +08:00
深夜看到,点赞+1024

顺带建议大家去围观一下作者的 wooyun ,超赞~
qgy18
    21
qgy18  
   2015-09-03 01:17:35 +08:00   ❤️ 1
有幸在楼主的截图中看到我的 ID ,前来冒泡!

其实我拿到阿里的 ECS 之后第一时间就干掉了云盾,对于 ubuntu 来说干掉服务和文件就可以了:
sudo update-rc.d -f aegis remove
sudo rm -rf /usr/local/aegis

昨天看阿里 ECS 的 TOS : http://help.aliyun.com/knowledge_detail/5974254.html ,有这么一段:

3.1.9. 您理解并认可,云盾服务是阿里云向您提供的 ECS 整体服务中的一项功能,您购买 ECS 服务,阿里云即向您提供云盾服务,如您不需开通云盾服务,您应按阿里云官网相关服务说明予以关闭或卸载此功能。

但是当时并没有找到任何关于卸载云盾的指引文档(现在有了),于是尝试提了一个工单,看看官方怎么说,具体的结果大家可以自己看截图:

phithon
    22
phithon  
OP
   2015-09-03 01:56:46 +08:00
@skxs067 不介意的~
@yexm0 @msg7086 我博客在 linode 呀,感觉暂时还挺稳定的
@qgy18 可能是这次事情以后加的,能合法卸载了这是好事~
aveline
    23
aveline  
   2015-09-03 03:05:41 +08:00
贴个卸载方式,之前在阿里云 Wiki 上看到的,现在应该还在,只不过藏的很深:

a ) wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh
b ) chmod +x quartz_uninstall.sh
c ) ./quartz_uninstall.sh
Livid
    24
Livid  
MOD
   2015-09-03 03:18:16 +08:00
@laotaitai 哪个帖子进不去了?
janxin
    25
janxin  
   2015-09-03 07:41:22 +08:00 via iPhone
@Livid http://www.v2ex.com/t/217786 这个在手机上点不进去
Livid
    26
Livid  
MOD
   2015-09-03 07:49:08 +08:00
@janxin 你在手机上看到的错误信息是?

能否提供截图或者抓包?
janxin
    27
janxin  
   2015-09-03 09:03:32 +08:00 via iPhone
@Livid 直接显示首页,没有报错。现在在火车上,等下车再说了
ljbha007
    28
ljbha007  
   2015-09-03 09:27:41 +08:00
我发现学 PHP 的好多都有这个自己用正则过滤注入的习惯
为什么不用 mysql_real_escape_string 之类的函数?
我这个半桶水的 PHP 都知道有这个函数啊
Livid
    29
Livid  
MOD
   2015-09-03 09:57:47 +08:00 via Android
@janxin 是这样的,最近部署的一个新逻辑,如果一个主题的正文里有 ssh 这三个字母,那么是需要登录及注册时间 10 天以上才可以看到的。
Livid
    30
Livid  
MOD
   2015-09-03 09:58:22 +08:00 via Android
@janxin 如果你在手机上登录了的话,是不会跳转的。
Khlieb
    31
Khlieb  
   2015-09-03 10:51:43 +08:00 via Android
@Orzzzz 闭关锁国是必须依靠权力维持的
Khlieb
    32
Khlieb  
   2015-09-03 10:55:29 +08:00 via Android
@PP 被☭带坏了,再说阿里巴巴财大气粗,跟监管新闻出版广电的部门出点钱就能摆平。
qgy18
    33
qgy18  
   2015-09-03 11:04:31 +08:00 via iPhone
@Livid L 大的自我审查策略也是蛮拼的。
akira
    34
akira  
   2015-09-03 11:05:14 +08:00
@ljbha007 mysql_real_escape_string 不是万能的。

安全问题是无止境的,无非是看你希望到什么程度,投入多少。
而简单粗暴的方法在前期无疑是非常划算的,无论如何,他比不做要好,对吧。
Khlieb
    35
Khlieb  
   2015-09-03 11:18:05 +08:00 via Android
@salmon5 阿里云的安全策略有问题,根本不把用户当回事
gDD
    36
gDD  
   2015-09-03 11:33:50 +08:00   ❤️ 1
@crll 这个文档 http://help.aliyun.com/knowledge_detail/6689106.html 卸载不完整,还漏下了 aegis_quartz ,这帮蠢货真不知道是怎么干活的, @aveline 发现的卸载脚本更完整,对比了一下只添加了删除 aegis_quartz 的部分。

curl http://update.aegis.aliyun.com/download/quartz_uninstall.sh | sudo sh
orvice
    37
orvice  
   2015-09-03 11:53:10 +08:00
@ljbha007 这个函数没办法安全防止注入
pmispig
    38
pmispig  
   2015-09-03 12:03:15 +08:00
我用阿里云的开通服务器之后第一件事:
#!/bin/bash
rm -rf /usr/local/aegis
for A in $(ps aux |grep Ali |grep -v grep |awk '{print $2}')
do
kill -9 $A;
done
腾讯云的更多
#!/bin/bash
#fuck tx process
rm -rf /usr/local/sa
rm -rf /usr/local/agenttools
rm -rf /usr/local/qcloud
process=(sap100 secu-tcs-agent sgagent64 barad_agent agent agentPlugInD pvdriver )
for i in ${process[@]}
do
for A in $(ps aux |grep $i |grep -v grep |awk '{print $2}')
do
kill -9 $A
done
done

chkconfig --level 35 postfix off
service postfix stop

echo ''>/var/spool/cron/root
echo '#!/bin/bash' >/etc/rc.local
ljbha007
    39
ljbha007  
   2015-09-03 12:09:05 +08:00
@akira
@orvice
肯定有别的函数 无论如何也比正则好嘛
ljbha007
    40
ljbha007  
   2015-09-03 12:21:07 +08:00
@orvice
@akira

我看了一下 大概是说的这个问题吗 还有没有别的缺陷呢?

http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string
lilydjwg
    41
lilydjwg  
   2015-09-03 13:38:38 +08:00   ❤️ 1
我见过这么一网站:凡是来自客户端数据中包含「 like 」字样的都报告「非法查询」,阻止客户端访问。所以, Google Chrome 啊 IE 11 啊这些「 like Gecho 」的浏览器去访问就是「非法查询」。

当然这也没什么。那个网站只支持 IE 5-7 访问的。
breeswish
    42
breeswish  
   2015-09-03 15:04:53 +08:00
个人觉得这和简单粗暴没有什么关系。。删恶意文件本身并不粗暴…个人电脑上的杀毒软件很多都是遇到已知的威胁直接就删了吧?现在是一个判断逻辑出错了导致所有可执行文件都被当做威胁对待了……这更多的是开发流程上有问题,审核测试等
crll
    43
crll  
   2015-09-03 15:16:04 +08:00
@gDD 感谢提供。
phithon
    44
phithon  
OP
   2015-09-03 15:24:23 +08:00
@breeswish 如果能 100%确定你删的是恶意文件,我也觉得不算粗暴。但 PC 上杀毒软件惹下的麻烦还不算多么,有的误删文件导致电脑都起不来的案例也不少,这算不算粗暴?
breeswish
    45
breeswish  
   2015-09-03 17:12:04 +08:00
@phithon 对于威胁除了删除隔离还能怎么样,先让它启动起来然后主动防御?我觉得还是先处理掉最好嘛
breeswish
    46
breeswish  
   2015-09-03 17:19:36 +08:00
@phithon

举个栗子,很多安全类 CDN 所谓的防注入就是请求参数上一旦有 SQL 片段就掐掉甚至 ban ip..这个确实叫做简单粗暴。不过这里的简单粗暴显然不是说「掐掉请求」或者「 ban ip 」是简单粗暴的,而是说直接判断请求参数来判断是否是注入的方式是简单粗暴的。对于有威胁的请求,阻断请求很科学嘛。

同理,对于这次事件涉及的产品来说,删除或隔离文件这个措施没问题,问题在于之前的判断逻辑。要说这个产品简单粗暴,那么要看它是如何识别威胁的。这次事件不足以说明相关产品是简单粗暴的 ╮(╯▽╰)╭
phithon
    47
phithon  
OP
   2015-09-03 17:47:05 +08:00
@breeswish
截断用户请求,最多影响一个用户一个 IP ,但随便删用户机器上的文件,一出错将导致整个业务当掉。还不够简单粗暴?
你把解决事情的方法想的太少了,比如对于这次误删的可执行文件,禁止执行,或者放入沙盒,就算是隔离掉,或重命名,哪个都比直接删除好。相对于这些方法,直接删除是不是粗暴?
janxin
    48
janxin  
   2015-09-03 20:48:28 +08:00 via Android
@Livid 我是 10 年注册的…现在复现不了了…
dragonszy
    49
dragonszy  
   2015-09-03 21:05:32 +08:00
记得老早有次诺顿直接把 windows 搞瘫了,也是影响数千企业吧。所以杀毒软件乱搞也是能直接影响企业的。
GuangXiN
    50
GuangXiN  
   2015-09-03 21:13:05 +08:00
@phithon 以前我也用 Linode ,但是后来发现真心不是每个中国的网络都能打开,实在不敢商用了……
Silicon
    51
Silicon  
   2015-09-03 22:30:18 +08:00
云盾服务条款
4.1 您理解并同意,阿里云无法保证其所提供的安全体检服务毫无瑕疵,但阿里云承诺不断提升服务质量及服务水平。所以您同意:在安全体检服务免费期间,阿里云将不对任何服务可用性、可靠性做出承诺,阿里云亦不对您使用安全体检服务的工作或结果承担任何责任。您并同意和阿里云共同合作,以解决上述瑕疵问题。
4.2 在适用法律允许的最大范围内,对因使用或不能使用阿里云安全体检所产生的损害及风险,包括但不限于直接或间接的个人损害、预期利润的丧失、贸易中断、商业信息的丢失或任何其它经济损失,阿里云不承担任何责任。
mutalisk
    52
mutalisk  
   2015-09-04 23:13:58 +08:00
我用了 gdb , gdb 被删了,用了 apt-get , dpkg 被删了,用了 wget , wget 被删了。
palytoxin
    53
palytoxin  
   2015-09-05 01:13:53 +08:00 via iPhone
@Livid 感觉就像是楼主说的,这个处理手法未免太暴力
abc123ccc
    54
abc123ccc  
   2015-09-05 10:24:19 +08:00
还好,我在备案当中,没有登录过 ECS 。免除一难。
lxw322
    55
lxw322  
   2015-09-14 10:32:49 +08:00
给作者点个赞
chousb
    56
chousb  
   2015-09-17 14:44:49 +08:00
作者牛逼,还没被和谐
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3769 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 00:54 · PVG 08:54 · LAX 16:54 · JFK 19:54
Developed with CodeLauncher
♥ Do have faith in what you're doing.