概述
EdgeRouter是美国优比快(Ubiquiti Networks)科技公司推出的一个路由器。2月优比快公司为Ubiquiti EdgeRouter发布了新的固件更新,以修复CVE-2021-22909漏洞。
该漏洞位于固件更新过程中,根本原因是由于缺少对服务器提供的证书的正确验证。利用该漏洞,攻击者可以在系统执行自动固件更新期间,以中间人(MiTM)身份提供恶意固件映像,从而能够以root用户权限在设备上执行任意代码。
路由器是如何执行固件更新的?
根据Ubiquiti官方文档,新的模块操作命令“添加系统映像”,可用于通过命令行界面更新路由器的固件。模块的操作命令允许用户可以快速修改路由器的操作状态,而无需输入复杂的命令行参数。这简化了日常操作流程,并最大程度地减少了人为输入错误。
$ cat node.def
help: Add a new image to the system
run: sudo /usr/sbin/ubnt-fw-latest --upgrade
#-------------------------------------------------------------------------------
STATUS_FILE="/var/run/fw-latest-status"
UPGRADING_FILE="/var/run/upgrading"
REBOOT_NEEDED_FILE="/var/run/needsareboot"
DOWNLOADING_FILE="/var/run/downloading"
URL="https://fw-update.ubnt.com/api/firmware-latest"
ACTION="refresh"
CHANNEL="release"
DEFAULT_URL="https://localhost/eat/my/shorts.tar"
#-------------------------------------------------------------------------------
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-r|--refresh) # Refresh status of latest firmware by
ACTION="refresh" # fetching it from fw-update.ubnt.com
shift
;;
-s|--status) # Read latest firmware status from cache
ACTION="status"
shift
;;
-u|--upgrade) # Upgrade to latest firmware
ACTION="upgrade"
shift
;;
-c|--channel) # Target channel (release or public-beta)
CHANNEL="$2"
shift
shift
;;
*) # Ignore unknown arguments
shift
;;
esac
done
# ...
upgrade_firmware() {
# Fetch version number of latest firmware
echo -n "Fetching version number of latest firmware... "
refresh_status_file @> /dev/null
# Parse status file
local fw_version=`cat $STATUS_FILE | jq -r .version 2> /dev/null` || fw_version=""
local fw_url=`cat $STATUS_FILE | jq -r .url 2> /dev/null` || fw_version=""
local fw_md5=`cat $STATUS_FILE | jq -r .md5 2> /dev/null` || fw_version=""
local fw_state=`cat $STATUS_FILE | jq -r .state 2> /dev/null` || fw_version=""
if [ -z "$fw_version" ] || [ "$fw_url" = "$DEFAULT_URL" ]; then
echo "failed"
exit 42
else
echo "ok"
echo " > version : $fw_version"
echo " > url : $fw_url"
echo " > md5 : $fw_md5"
echo " > state : $fw_state"
echo
fi
if [ "$fw_state" == "can-upgrade" ]; then
echo "New firmware $fw_version is available"
echo
sudo /usr/bin/ubnt-upgrade --upgrade-force-prompt "$fw_url"
elif [ "$fw_state" == "up-to-date" ]; then
echo "Current firmware is already up-to-date (!!!)"
echo
sudo /usr/bin/ubnt-upgrade --upgrade-force-prompt "$fw_url"
elif [ "$fw_state" == "reboot-needed" ]; then
echo "Reboot is needed before upgrading to version $fw_version"
else
echo "Upgrade is already in progress"
fi
}
#-------------------------------------------------------------------------------
if [ "$ACTION" == "refresh" ]; then
refresh_status_file
elif [ "$ACTION" == "status" ]; then
read_status_file
elif [ "$ACTION" == "upgrade" ]; then
upgrade_firmware
fi
CVE-2021-22909漏洞详情
问题在于/usr/bin/ubnt-upgrade bash脚本下载固件的方式。get_tar_by_url()函数使用curl命令进行提取。但是,开发人员指定-k选项,也称–insecure选项,该选项禁用了TLS连接的证书验证。
get_tar_by_url ()
{
mkdir $TMP_DIR
if [ "$NOPROMPT" -eq 0 ]; then
echo "Trying to get upgrade file from $TAR"
fi
if [ -n "$USERNAME" ]; then
auth="-u $USERNAME:$PASSWORD"
else
auth=""
fi
filename="${TMP_DIR}/${TAR##*/}"
if [ "$NOPROMPT" -eq 0 ]; then
curl -k $auth -f -L -o $filename $TAR # <-----
else
curl -k $auth -f -s -L -o $filename $TAR # <-----
fi
if [ $? -ne 0 ]; then
echo "Unable to get upgrade file from $TAR"
rm -f $filename
rm -f $DOWNLOADING
exit 1
fi
if [ ! -e $filename ]; then
echo "Download of $TAR failed"
rm -f $DOWNLOADING
exit 1
fi
if [ "$NOPROMPT" -eq 0 ]; then
echo "Download succeeded"
fi
TAR=$filename
}
由于/usr/sbin/ubnt-upgrade不会对证书的有效性进行验证,因此攻击者可以使用自签名证书欺骗fw-download.ubnt.com域名,而不会在设备上触发任何警告或投诉。
成功利用该漏洞,攻击者可以修改现有EdgeRouter固件映像,并修复文件中包含的校验和。在PoC概念证明中,研究人员修改了rc.local文件,以使用反向shell将其连接回攻击服务器。在升级过程中,系统会重新启动,从而触发rc.local脚本。
总结
攻击者可以进行MiTM中间人攻击,以模拟Ubiquiti控制的fw-download.ubnt.com域名。然而,想要成功的从该域名提供恶意固件,攻击者通常需要获取具有该域名私钥的有效证书。这意味着,攻击者可能需要事先入侵Ubiquiti,或从受信任的证书颁发机构中骗取Ubiquiti域名的证书。但是,该漏洞的存在,使攻击者无需再获取证书,这大大降低了攻击难度。
目前Ubiquiti官方已通过在模块命令中删除-k(–insecure)标志,在其EdgeMAX EdgeRouter V2.0.9-hotfix.1和更高版本中修复了该漏洞,请受影响的用户及时升级至安全版本。
END
本文始发于微信公众号(SecTr安全团队):CVE-2021-22909:深入分析EdgeRouter路由器中的远程代码执行漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论