文章
江湖

对养猫君对葱爆的分析的分析

thphd  ·  2021年9月3日 2047前站长

@爱狗却养猫 #155212

首先我不认为钢铁雄心(HOI)进行的攻击是造成品葱数据丢失的原因。品葱丢失了大半年的数据,最大的可能性是服务器出现故障造成数据库损坏,责任一半在于不可抗力,一半在于品葱站长长期不自行备份数据。HOI攻击的效果是增加品葱的管理负担,占用其私信空间,但品葱大故障恐怕不能甩锅/归功于ta

虽然养猫君的个人数字安全防护做得很完善,但他并非IT从业人士,对于架服务器办网站方面的技术分析,看的时候要在心里打个折扣

首先,新品葱网站是云服务器而不是物理服务器(100%确定),CF之前被别人记录过IP。

  • 2047的服务器在专人托管的电信机房里,很多操作没有云服务方便,uptime也没有云服务高,但是硬件配置可以随时加减,且不用担心被服务商删封(下面会详细讲)。从建站到现在2047发生过好几次宕机事故,除了第一次因为物理问题损失10天内容(且绝大部分由本人配合网友修复)以外,中间好几次都是利用备份数据直接复原,包括虚拟机都换了几次,但一般用户除了服务临时中断之外基本不会有什么感觉。物理服务器的好处就在这里:**即使遇到操作系统无法启动的严重故障,也可以打电话到机房,让工程师把硬盘拔下来、数据拷出来。**而云服务器一旦无法启动,如果跟服务商关系不好,就只能听天由命了。

    不过物理服务器并非2047的专利,创世之初,所有网站都是物理服务器的,例如acfun最开始建站的时候就是一台机械硬盘的家用PC~

  • 云服务器备份麻烦,很有可能是站长这么久不备份的原因之一(2047是每10分钟全站备份一次),因为云服务器在云上,从云上把整个数据库拖下来是需要时间和带宽的(自动备份要加钱,下面会提到),以及云上没有windows(windows也要加钱),很多操作很麻烦,而品葱站长水平又低又吝啬又怕麻烦是众所周知的。

  • 最早新品葱是有每周数据备份的,但公开的都是一个月前的备份,因为站长担心提供最近的备份会导致用户被社工。2020年4-7月新品葱出现站务危机,后来站长就越来越少公开备份了,估计是怕被人拿来搞破坏。in comparison,2047最近一次公布的备份是8月24号的https://github.com/thphd/2047/releases/tag/0.0.1

既然是云服务器,就不得不提云服务器最大的优点:几乎不会故障。

  • 云服务器的CPU、内存不是实体CPU、内存,而是带有冗余的虚拟CPU、内存。实体服务器关机以前,是可以把虚拟机无缝迁移到其他实体服务器上继续运行的。所以云服务器可以实现大半年不关机。

  • 云服务器的硬盘不是实体硬盘,而是带有冗余校验的虚拟硬盘,基本上可以说只要机房不着火不进水,很难把数据弄丢、搞坏,所以云服务器的数据可以大半年不备份。而物理服务器必须时刻备份,否则硬盘挂掉就啥都没了,2047每10分钟备份一次正是因为是这个原因。

所以**“最大的可能性是服务器出现故障造成数据库损坏”**是不正确的。

  • 但是云服务器有一种情况会把数据搞丢,那就是站长忘了给服务商续费,或者因为违反美国或者日本法律或者服务协议,被服务商终止服务,然后服务商把硬盘删掉了,因为是虚拟硬盘所以跟删文件一样方便,而且删掉之后很难找回来。品葱站长为了匿名,选择的是没有KYC的服务商,网友捐款又被他自己贪掉了(不然不会变成现在这样,要知道Vultr的付费随时自动备份功能只需多交20%费用,而品葱站长收了几千美金捐款外加法轮功广告费),所以现在出现这种问题,服务商大概率是不会开后门的。

  • 2047是物理服务器,想删2047的数据,要么技术高深黑进来把所有备份删掉,要么一把火把机房烧了。而且就算机房烧了,github上也还有数据,使用GPG登陆的朋友也仍然可以登陆。

了解了云服务器和物理服务器的区别之后,我们再来看葱爆的案子:

  • 钢铁雄心(HOI)给品葱站长喂紫薯布丁(发垃圾消息),是一种DoS攻击,由于品葱服务器的磁盘大小是有限的(而且非常有限),随着布丁越喂越多,磁盘剩余空间会越来越小,直到塞满,数据库无法写入。

  • 数据库无法写入也就无法读出(因为读出的过程必然伴随写入,例如你看帖子会增加阅读数),网站当然就无法工作了。这时如果品葱站长重启服务器,因为开机过程也是需要写入磁盘的,磁盘空间不足可能导致开机卡死。而云服务器无法开机就连不上,也就无法进行远程操作,不像物理服务器可以直接拔硬盘读数据。这时如果站长急中生智,作出一些奇妙的误操作,就可能导致虚拟硬盘被删除。当然,也可能品葱服务器空间本来就不足了,HOI喂的补丁成了骆驼背上的最后一根稻草。

  • MySQL遇到磁盘已满的情况,并不会返回DISK_FULL错误并拒绝服务,而会直接当场卡死,除非非常了解mysql工作原理,否则只能强行重启:https://dev.mysql.com/doc/refman/8.0/en/full-disk.html

  • 所以另一种情况是,品葱站长强行重启了服务器,开启了数据库,数据库尝试从上一次强行重启的地方开始恢复。由于几乎所有数据库都依赖某种b+tree,而b+tree最流行的实现是leveldb(myrocks),leveldb极度依赖底层磁盘的顺序写入特性,如果底层磁盘(这个例子中是虚拟磁盘)不完全是顺序写入的(例如为了性能开启写入缓存),那么强行重启就会导致丢失最近写入的几个ldb文件,而leveldb在这种故障模式下完全无法recover(因为作者假定磁盘是强顺序写入的),使得强行重启有一定几率会导致丢失自上次启动数据库以来的所有数据。刚才已经说过,品葱服务器很可能是大半年不重启的。当然品葱的MySQL用的是什么后端我不清楚,但磁盘已满导致软件错误(而不是硬件故障)在IT界是非常常见的,运维老司机的法宝就是在每个磁盘放一个8G的空文件,如果任何原因导致磁盘已满,删掉文件就可以让服务瞬间恢复正常,然后再去花时间进一步排除问题。

所以说**“品葱大故障恐怕不能甩锅/归功于HOI”**,我觉得不合适,就目前掌握的证据,结合相关专业知识来看,我认为有30%可能性是HOI导致的,余下责任则归于品葱站长个人弃坑。当然HOI可能说谎,但同样的鹿儿也可能说谎,不应轻易下结论。

菜单
  1. 葛花A  

    顺便补充一下,葱爆当天早上9点半开始品葱还是变得非常缓慢,直到10点到下午五点完全无法打开,五点开始似乎完全正常,2分钟后便彻底无法访问,一直提示拒绝访问,然后主机彻底掉线。如果品葱服务器配置捉襟见肘的话倒也不是没有可能。

  2. 葛花A  

    另外早年品葱有人冒充我想害我丢工作时我就上去查过这个网站,找到了一个不是cf的IP,不知道是不是它本站的IP。但是从国内ping不通,也有可能是GFW记录过他的本机iP(这事还得感谢品葱自己,品葱上居然有品葱服务器的真实IP你说怪不怪),让国安的人把他打瘫了吧。

  3. thphd   2047前站长

    @葛花A #155439

    顺便补充一下,葱爆当天早上9点半开始品葱还是变得非常缓慢,直到10点到下午五点完全无法打开,五点开始似乎完全正常,2分钟后便彻底无法访问,一直提示拒绝访问,然后主机彻底掉线。

    磁盘逐渐被填满,swap逐渐耗尽的征兆。

  4. 邹韬奋 外逃贪官CA
    邹韬奋   虽然韬光养晦,亦当奋起而争(拜登永不为奴:h.2047.one)

    “所以另一种情况是,品葱站长强行重启了服务器,开启了数据库,数据库尝试从上一次强行重启的地方开始恢复。由于几乎所有数据库都依赖某种b+tree,而b+tree最流行的实现是leveldb(myrocks),leveldb极度依赖底层磁盘的顺序写入特性,如果底层磁盘(这个例子中是虚拟磁盘)不完全是顺序写入的(例如为了性能开启写入缓存),那么强行重启就会导致丢失最近写入的几个ldb文件,而leveldb在这种故障模式下完全无法recover(因为作者假定磁盘是强顺序写入的),使得强行重启有一定几率会导致丢失自上次启动数据库以来的所有数据。刚才已经说过,品葱服务器很可能是大半年不重启的。当然品葱的MySQL用的是什么后端我不清楚,但磁盘已满导致软件错误(而不是硬件故障)在IT界是非常常见的,运维老司机的法宝就是在每个磁盘放一个8G的空文件,如果任何原因导致磁盘已满,删掉文件就可以让服务瞬间恢复正常,然后再去花时间进一步排除问题。”

    这个神奇了,mark之。

    EDIT:鹿首相发表以下宣言:“2021.9.2.品蔥的維基百科條目開始出現竄改現象,所增添的一條訊息( 数据恢复取得重大进展,品葱将于48小时内恢复营运)其來源是冒用本人名義的假帳號,內容非屬實,該網站亦不安全,對方曾有多次惡意編輯品蔥維基條目的紀錄

    目前站方仍在努力復原備份數據

    2021.9.3.數據仍嚴重缺失,站方決定先行恢復網站運作,而後再逐漸復原數據。大家做好心理準備”

    看来站长的mysql水平确实是高,基本上全中了。

  5. 葛花A  

    @thphd #155445 葱爆方式太神奇了,私信居然不设置频率和上限,这种低级错误国内无数论坛爱好者都犯过,品葱站长还是没经过国内互联网毒打过。另估计轮子给的赞助费一半以上是被品葱站长拿去改善生活了吧,连个独立服务器都用不起。今天也出过新闻,亚马逊云也要删除自己上门的极端内容,冲浪TV也被reddit打上R18不健康的标签,以后这种极端反中言论估计难有出路了,以后葱爆次数还得加剧。

  6. thphd   2047前站长

    @葛花A #155456

    今天也出过新闻,亚马逊云也要删除自己上门的极端内容,冲浪TV也被reddit打上R18不健康的标签,以后这种极端反中言论估计难有出路了,以后葱爆次数还得加剧。

    姨学诸夏独立 ×

    网站机房独立 √

  7. Ambulance 阿弥陀佛
    Ambulance   夫人必自侮,然後人侮之;家必自毀,而後人毀之;國必自伐,而後人伐之。

    说实话用云服务器还能搞到数据丢失这我也是没想到。

    我自己架的VPS大多数情况下其实每周备份都可以,但全部都至少做到每24小时定时备份。 现在大多数主流云服务器后台都非常好用,设置自动备份也就是几分钟的事情。

    然而就品葱的规模,设置个自动备份实际上也不会增加太多成本。说明品葱站长显然要么是偷懒,要么就是为了省钱。

  8. yogafire  

    虽然不赞同lz对鹿阿姨的评价 但是lz能用简单的大白话把分析说清楚,让我这种对编程一窍不通的人也能理解,这点非常赞

  9. 钢铁雄心 (^_^)?
    钢铁雄心   (钓鱼网站已屏蔽)

    @葛花A #155456 这个大BUG近快三年还没被五毛发现?难不成站长和中共有秘密交易?

    还有感谢各大互联网巨头帮姨杀队清洗真反中派

  10. 品韭縫合怪  

    mysql的數據庫並沒有文章所描述的那麼不堪,如果進程重啓就會數據全丟,那麼mysql則不會在世界範圍內廣泛使用。事實上kill mysql進程重啓,僅僅只會丟失內存中緩存的部分數據,最多丟失一小段時間的內容,不太可能完全丟失

    從蔥爆的時間長度,症狀,到鹿某人的說法,我傾向於服務商的問題,而非硬盤損壞,現在雲供應商的硬盤陣列容災是標配,這樣低級的硬盤損毀數據全丟我猜僅可能為起火或洪水等不可抗力之因素。

  11. thphd   2047前站长

    @品韭縫合怪 #155555

    如果進程重啓就會數據全丟,那麼mysql則不會在世界範圍內廣泛使用。

    原文所述并非进程重启,而是死机强制重启。也不是mysql的锅,而是虚拟存储的锅

  12. 邹韬奋 外逃贪官CA
    邹韬奋   虽然韬光养晦,亦当奋起而争(拜登永不为奴:h.2047.one)

    @品韭縫合怪 #155555 云服务器上的数据又不是存在一个机房里的,而是有冗余有备份的。机房炸了,顶多是2047这种租物理服务器的玩家死球。云玩家不怕你炸一个机房。