Небезопасная реализация SSL - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я оцениваю безопасность мобильного приложения и только что использовал MobSF для сканирования файла APK на наличие уязвимостей. Фрагмент кода ниже помечен сканером как небезопасный из-за «небезопасной реализации SSL. Доверие ко всем сертификатам или принятие самозаверяющих сертификатов является критической дырой в безопасности. Это приложение уязвимо для атак MITM. CVSS V2: 7.4 (высокая) CWE: CWE-295 - Неправильная проверка сертификата OW ASP Топ 10: M3: Небезопасная связь OW ASP MASVS: MSTG-NETWORK-3 "

Я именно то, что, в частности, заставляет сканер думать, что Приложение доверяет всем сертификатам.

package j.m0.i.h;

import android.net.SSLCertificateSocketFactory;
import android.os.Build;
import h.i.c.g;
import h.m.f;
import j.b0;
import j.m0.i.b;
import java.util.List;
import javax.net.SocketFactory;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import kotlin.TypeCastException;

public final class b implements h {
    public final SSLCertificateSocketFactory a;

    public b() {
        SocketFactory socketFactory = SSLCertificateSocketFactory.getDefault(10000);
        if (socketFactory != null) {
            this.a = (SSLCertificateSocketFactory) socketFactory;
            return;
        }
        throw new TypeCastException("null cannot be cast to non-null type android.net.SSLCertificateSocketFactory");
    }

    public String a(SSLSocket sSLSocket) {
        if (sSLSocket != null) {
            String applicationProtocol = sSLSocket.getApplicationProtocol();
            if (applicationProtocol != null && !g.a((Object) applicationProtocol, (Object) "")) {
                return applicationProtocol;
            }
            return null;
        }
        g.a("sslSocket");
        throw null;
    }

    public boolean b(SSLSocket sSLSocket) {
        if (sSLSocket != null) {
            String name = sSLSocket.getClass().getName();
            g.a((Object) name, "sslSocket.javaClass.name");
            return f.b(name, "com.android.org.conscrypt", false, 2);
        }
        g.a("sslSocket");
        throw null;
    }

    public void a(SSLSocket sSLSocket, String str, List<? extends b0> list) {
        if (sSLSocket == null) {
            g.a("sslSocket");
            throw null;
        } else if (list != null) {
            this.a.setUseSessionTickets(sSLSocket, true);
            SSLParameters sSLParameters = sSLSocket.getSSLParameters();
            g.a((Object) sSLParameters, "sslParameters");
            Object[] array = j.m0.i.g.f5034c.a(list).toArray(new String[0]);
            if (array != null) {
                sSLParameters.setApplicationProtocols((String[]) array);
                sSLSocket.setSSLParameters(sSLParameters);
                return;
            }
            throw new TypeCastException("null cannot be cast to non-null type kotlin.Array<T>");
        } else {
            g.a("protocols");
            throw null;
        }
    }

    public boolean a() {
        b.a aVar = j.m0.i.b.f5017h;
        return j.m0.i.b.f5015f && Build.VERSION.SDK_INT >= 29;
    }
}
...