微慑信息网

CVE-2019-3462:Linux 包管理器apt/apt-get远程代码执行

0x00 漏洞背景

2019年1月22日 @Max Justicz 在其博客中公开了有关于 debian 系包管理器apt/apt-get 远程代码执行的一些细节。当通过 APT 进行任意软件的安装、更新等,默认会走 HTTP 而非 HTTPS,攻击者可以通过中间人劫持等手法劫持 HTTP 流量,并通过重定向及相关响应头的构造,完美构造合法的安装包签名,以此绕过 APT 本地签名的判断。攻击一旦触发,便可导致目标服务器的 root 权限被拿下。

360CERT 判断该漏洞危害严重,影响面有限。建议使用Debain系发行版的用户及时进行apt 软件的更新或者对服务器进行流量自查。

0x01 漏洞详情

在获取数据时,apt会fork出worker进程用于数据传输。父进程使用类似于HTTP的协议通过stdin/stdout与这些worker进程进行通信,告诉它们下载什么以及将下载的内容放在文件系统的什么位置上。例如,当apt install cowsay时fork出/usr/lib/apt/methods/http,返回一条100 Capabilities消息:

父进程会发送它的设置并且请求一个资源:

然后worker进程的响应像下面这样:

当HTTP服务器返回redirect重定向时,worker进程返回103 Redirect而不是201 URI Done,然后父进程使用这个响应来确定接下来应该请求的资源:

漏洞在于对Location进行URL解码后就将其直接将其附加到103 Redirect响应中,造成了注入。

如果HTTP服务器返回的Location为:

则响应包如下:

那么再进一步构造:

就会形成具有危害的情况:

这时apt就会受到攻击者的控制,安装指定的package并且可以完美通过校验步骤,进而导致apt/apt-get安装到非官方源中的package。而由于apt/apt-get一般情况下只能由权限相对较高的用户执行,进而导致恶意的package可以任意执行代码/命令。

0x02 补丁分析

AcqMethod::Redirect函数通过对NewURI中的字符进行校验来修复该漏洞。

0x03 修复建议

Debain 可以通过添加 security 分支的源进行更新,主分支还受到影响

 

确保/etc/sources.list含有如下字段

再执行apt update && apt-get install apt即可完成修复更新

Ubunutu 可以进行软件包版本升级

对应系统升级到如下版本:

  • Ubuntu 18.10 apt – 1.7.0ubuntu0.1
  • Ubuntu 18.04 LTS apt – 1.6.6ubuntu0.1
  • Ubuntu 16.04 LTS apt – 1.2.29ubuntu0.1
  • Ubuntu 14.04 LTS apt – 1.0.1ubuntu2.19

或者在更新时禁用 HTTP 重定向:

再者可以使用完全由 https 构成的源进行更新

0x04 时间线

2019-01-22 @Max Justicz公开漏洞细节

2019-01-23 360CERT发布预警

0x05 参考链接

  1. Remote Code Execution in apt/apt-get

    [https://justi.cz/security/2019/01/22/apt-rce.html]

拓展阅读(点评/知识):

检查脚本:

#!/bin/bash

# https://www.debian.org/security/2019/dsa-4371
# https://security-tracker.debian.org/tracker/CVE-2019-3462

function check()
{
  dpkg --compare-versions ${1} ge ${2}

  if [ "$?" -eq 0 ]
  then
    echo "OK"
  else
    alert ${OS_VENDOR} ${OS_RELEASE} ${APT_VERSION}
  fi
}

function fail()
{
  printf "Unknown GNU/Linux version (%s %s)" ${1} ${2}
}

function notice()
{
  printf "apt not installed"
  exit
}

function alert()
{
  printf "Vulnerable version! (%s %s) (apt %s)" "${1}" "${2}" "${3}"
  exit
}

which apt > /dev/null || notice

OS_VENDOR=$(lsb_release -si)
#OS_VERSION=$(cut -d . -f 1 /etc/debian_version)
OS_VERSION=$(lsb_release -sr | cut -d . -f 1)
OS_RELEASE=$(lsb_release -sc)
APT_VERSION=$(apt --version 2>/dev/null | head -n 1 | awk '{print $2}')

DEBIAN_8_APT_VERSION=1.0.9.8.5
DEBIAN_9_APT_VERSION=1.4.9
UBUNTU_12_APT_VERSION=0.8.16~exp12ubuntu10.28
UBUNTU_14_APT_VERSION=1.0.1ubuntu2.19
UBUNTU_16_APT_VERSION=1.2.29ubuntu0.1
UBUNTU_18_APT_VERSION=1.6.6ubuntu0.1

case ${OS_VENDOR}
in
  Debian)
    case ${OS_VERSION}
    in
      8)
        check ${APT_VERSION} ${DEBIAN_8_APT_VERSION}
        ;;
      9)
        check ${APT_VERSION} ${DEBIAN_9_APT_VERSION}
        ;;
      *)
        fail ${OS_VENDOR} ${OS_RELEASE}
        ;;
    esac
  ;;
  Ubuntu)
    case ${OS_VERSION}
    in
      12)
        check ${APT_VERSION} ${UBUNTU_12_APT_VERSION}
        ;;
      14)
        check ${APT_VERSION} ${UBUNTU_14_APT_VERSION}
        ;;
      16)
        check ${APT_VERSION} ${UBUNTU_16_APT_VERSION}
        ;;
      18)
        check ${APT_VERSION} ${UBUNTU_18_APT_VERSION}
        ;;
      *)
        fail ${OS_VENDOR} ${OS_RELEASE}
        ;;
    esac
  ;;
esac

相关地址:

https://github.com/tonejito/check_CVE-2019-3462

https://paper.seebug.org/799/#_2

https://paper.seebug.org/799/#_2

本文标题:CVE-2019-3462:Linux 包管理器apt/apt-get远程代码执行
本文链接:
(转载请附上本文链接)
http://vulsee.com/archives/vulsee_2019/0125_7303.html
转载请附本站链接,未经允许不得转载,,谢谢:微慑信息网-VulSee.com » CVE-2019-3462:Linux 包管理器apt/apt-get远程代码执行
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

微慑信息网 专注工匠精神

访问我们联系我们