Posts

Showing posts from March, 2018

X-Sec Antivirus开发者日志 - 数据库出麻烦了

今天下午准备进云库后台拉黑几个hash,突然发现登录后台的时候永远返回HTTP 500(当然我通过配置替换了报错页面),当时就猜数据库是不是出事了。
只不过我那时候并没法确认,索性打开一个数据库连接工具准备直连数据库,提示超过单用户连接数超过max_user_connections指定的值。
果然是数据库出事了。
那么原因是啥呢?
前段时间队友把云查接口更新了下,说是OpenAsync函数打开数据库连接时非常影响效率,索性决定进行连接复用,每次连数据库时总是优先利用未断开的数据库连接,并且在整个云查流程中不关闭数据库连接。
这个时候问题就出现了。虽说不显式关闭连接的话,GC会帮我们做这件事,但是这个周期我们并不可控(除非显式函数调用GC回收)。如果GC在某种情况下出现了死活不触发回收,然后连接数慢慢累积超过单用户连接数上限,那么数据库就GG了,后续连接全部无法建立。
问题已经很明显了,解决方法自然也就明了了。

我们在云查接口显式加入了关闭连接函数的调用,只不过加在了整个处理流程的末尾,处理流程期间的多次数据库查询依旧可以尽可能保证连接复用费了好大的劲找到了MySQL的配置文件路径(通过Plesk装的,路径和常规安装姿势不同),发现max_connections和max_user_connections的值都比较小(前者为155,后者为30,这个数值我并没有主动做过修改),将前者改成了576,后者改为了192。同时根据实际情况关闭了外部锁定和名称解析 上传新版接口文件,重启数据库,一切恢复正常。(今天下午快5点的时候才彻底恢复)
只不过事情还没完。
http://www.majorgeeks.com/files/details/x_sec_antivirus.html
今天晚上,突然发现X-Sec Antivirus已经成功上了MajorGeeks下载站(上线时间就是今天),下载站的测评员在评测里吐槽这玩意误报过多。把这事跟队友一说,他回了我一句:“怕不是云挂掉的时候评测的”。
想了想,还真的有可能哈~23333

X-Sec Antivirus开发者日志 - 写在2.1.0.0发版之后

刚刚把发版相关的事情全部处理完,整个处理过程,本人内心尽量保持平静(因为如果过度激动的话很容易捅娄子)。
处理完之后也算是松了一口气,只不过我仍旧担心云查在国内是否可以正常工作(我这边需要挂代理。应该是受到了“特殊时期”的影响,过了这个月应该就好了)。
在这儿再次感谢各位内测用户对X-Sec Antivirus的支持,因为你们,X-Sec Antivirus在这两个半月的内测期才能被打磨的更好。
只不过对于X-Sec Antivirus来说,路还很长,还有很多东西需要做,我们也有很多想法想逐个尝试实现。
我有很多话想说,但是真正开始写blog的时候却发现写不出来...索性就写这么多吧~
最后希望大家喜欢X-Sec Antivirus的这个新版本。

钓鱼网站作者令人窒息的新操作

Image
不久前朋友给我发来一个网址说可能是钓鱼网站,让我帮忙看看。 运气不错,PC端可以直接打开。 长这样 高仿QQ空间手机版网页登陆页面,“注册新账号”和“忘了密码”也是可以点击的(都是腾讯官方链接)。 只不过右上角的“举报”引起了我的注意,鼠标指了一下,发现会跳到同站的另一个页面。 网站域名已经在上面那张图里明写着了,有兴趣的可以去看看。“举报网址”里就是那个举报页面的URL(不是钓鱼页面的URL,但是在同一个域名下)。 钓鱼作者也是有心,还做了个“举报”页面,或许部分认出来这是钓鱼网站的人还真的会点进去顺手举报一下(只不过我个人觉得这个概率真的很低)。 但是令人窒息的操作在后面。 首先我并没有急着去看网页源代码,试了试那个验证码,无论如何都通不过去既然通不过去,那我直接点举报试试吧(举报原因我都不选了),没想到... 能倒腾的都倒腾完了,接下来就来看看源代码来“解密”这些最新操作了。 主要的钓鱼页面咱们不多看,没啥有意思的。有意思的集中在那个假的举报页面。 Q1:为什么验证码死活过不去呢? A1:如下图,直接用的腾讯那边的验证,怎么可能会过嘛~ Q2:那个“提交举报”后的提示又是什么鬼? A2:如下图,点击“提交举报”后,按照下面的JavaScript代码,这个网站还真的向腾讯的网址安全中心提交了一条举报。只不过如果提交成功,执行的callback函数却是弹出之前的那个令人窒息的提示。 Q3:还有什么想说的吗? A3:感觉这个举报页面也是原版页面上动了些手脚,主要就把callback函数改了下而已。另外,钓鱼页面内容是被document.write写上去的,并非直接展示,而且使用了一些常规的迷惑分析员和网页内容分析工具的技巧。

X-Sec Antivirus开发者日志 - 居然有一个这么大的bug我没发现!

今天是元宵节(其实已经过了0点了,元宵节已经过了),在这儿给大家送上迟来的元宵祝福。祝大家元宵节快乐!

接下来进入正题。
元宵节当天晚上恰好是X-Sec Antivirus 2.0.0.0 Beta4发版的时候(当时定日期的时候我并没有意识到这一点)。由于晚上时间稍微有些吃紧,初次发版的时候我忘记了前段时间更新了一个第三方库,而更新的库文件并没有放进增量包内。发版之后我照常在服务器上做个测试,结果却发现程序根本启动不起来,直接炸了,这才想起库文件没有同步更新。迅速换完包之后程序可以正常跑起来了。

然而事情并没有结束,由于新版本加入了“文件缓存”特性,想体验一下具体有多大的效果,于是我进行了一次扫描。
扫描半路崩溃了,当时原因不明。
在我自己的机器上进行扫描,也是扫描半路崩溃,尝试附加调试器却提示进程已经崩溃,无法附加调试器。
无奈,只好去查系统日志,在Event Viewer里总算是看到了更多的信息,系统提示SQLite这个第三方库里出现了空指针引用从而导致了崩溃。
这点信息当时并没有带给我多少头绪,而且这么严重的bug用户肯定是会发现的,得尽快想个解决办法。

于是我迅速修改了各个发布点,告知了用户这个严重bug并建议用户暂时不要使用新版本。
然后去洗了个澡。

洗澡过程中算是想明白了。
我们这边每一个扫描任务都是多线程扫描,而文件缓存采用数据库存储,缓存添加操作也是在扫描文件的过程中进行。更重要的是,数据库处理的函数用的数据库连接的对象被我们设置了静态属性,这样重入的时候就有麻烦了...
解决方法有两个,要么数据库处理函数内部使用的数据库连接对象去除静态属性,要么用读写锁限制重入。最后我们选择了后者。

现在Bug已经修复,增量包已经替换,各个发布点上的额外说明也已替换,一切回归平静。