Changeset b305eb5b7 in mythtv


Ignore:
Timestamp:
Oct 17, 2014, 4:32:02 PM (10 years ago)
Author:
Stuart Morgan <smorgan@…>
Branches:
fixes/0.27
Children:
c4de5c5e17
Parents:
e830993e8
git-author:
Stuart Morgan <smorgan@…> (10/17/14 16:32:02)
git-committer:
Stuart Morgan <smorgan@…> (10/17/14 18:18:22)
Message:

Security: Disallow SSDP device discovery from non-local addresses.

Protection against MythTV's use in SSDP Reflection attacks.

https://www.prolexic.com/knowledge-center-ddos-threat-advisory-ssdp-reflection-ddos-attacks.html
https://www.prolexic.com/kcresources/prolexic-threat-advisories/prolexic-threat-advisory-ssdp-reflection-ddos-attacks/ssdp-reflection-attacks-cybersecurity-locked.html

No CVE assigned yet.

(cherry picked from commit 52cb0b5679a5b20a55ba5cbe6b1064b72c66576f)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mythtv/libs/libmythupnp/ssdp.cpp

    re830993e8 rb305eb5b7  
    315315void SSDP::ProcessData( MSocketDevice *pSocket )
    316316{
     317    QHostAddress  peerAddress = pSocket->peerAddress();
     318    quint16       peerPort    = pSocket->peerPort   ();
     319
     320    // Mitigate against SSDP Reflection DDOS attacks
     321    // Disallow device discovery from non-local addresses
     322    // Security Advisory (Akamai):
     323    // https://www.prolexic.com/kcresources/prolexic-threat-advisories/prolexic-threat-advisory-ssdp-reflection-ddos-attacks/ssdp-reflection-attacks-cybersecurity-locked.html
     324    // https://www.prolexic.com/knowledge-center-ddos-threat-advisory-ssdp-reflection-ddos-attacks.html
     325    //
     326    // TODO: We may want to restrict this to the same subnet as the server
     327    //       for added security
     328    if (((peerAddress.protocol() == QAbstractSocket::IPv4Protocol) &&
     329            (!peerAddress.isInSubnet(QHostAddress("172.16.0.0"), 12) &&
     330            !peerAddress.isInSubnet(QHostAddress("192.168.0.0"), 16) &&
     331            !peerAddress.isInSubnet(QHostAddress("10.0.0.0"), 8))) ||
     332        ((peerAddress.protocol() == QAbstractSocket::IPv6Protocol) &&
     333            !peerAddress.isInSubnet(pSocket->address(), 64))) // default subnet size is assumed to be /64
     334    {
     335        LOG(VB_GENERAL, LOG_CRIT, QString("SSDP Request from WAN IP "
     336                                            "address (%1). Possible SSDP "
     337                                            "Reflection attempt. Ignoring as "
     338                                            "security risk.")
     339                                                .arg(peerAddress.toString()));
     340        pSocket->readAll(); // Discard the data in the socket buffer
     341        return;
     342    }
     343
    317344    QByteArray buffer;
    318345    long nBytes = 0;
     
    366393            continue;
    367394
    368         QHostAddress  peerAddress = pSocket->peerAddress();
    369         quint16       peerPort    = pSocket->peerPort   ();
    370 
    371395        // ------------------------------------------------------------------
    372396        QString     str          = QString(buffer.constData());
Note: See TracChangeset for help on using the changeset viewer.