Skype su GNU/Linux

Accessi a /etc/passwd, /etc/mtab, profili Firefox

Di recente ho letto sulla rete preoccupazioni varie per il fatto che un tizio si è accorto che Skype accede al file /etc/passwd. Intanto, ho verificato se la cosa era vera con un semplice comandino (non c'è bisogno di AppArmor)

strace percorso/fino/a/skype 2>&1 |egrep etc/

Alla fine questo comando ha prodotto il seguente output (solo le ultime righe sono riportate)

open("/etc/mtab", O_RDONLY)             = 8
open("/etc/nsswitch.conf", O_RDONLY)    = 8
read(8, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1233
open("/etc/ld.so.cache", O_RDONLY)      = 8
open("/etc/ld.so.cache", O_RDONLY)      = 8
open("/etc/passwd", O_RDONLY)           = 8

Accede a mtab ... per informarsi di che device sono montati... ma che gli importa? Poi legge nsswitch.conf (Name Service Switch), e poi anche a passwd. Ma ci accorgiamo subito dall'accesso a ld.so.cache che è possibilissimo che questi accessi siano in realtà conseguenza di specifiche funzioni, perfettamente lecite, di librerie...

Intanto possiamo esser sicuri che le nostre password sono al sicuro... c'è lo shadowing. Tuttavia non altrettanto per i nomi dei nostri utenti; chissà, magari vengono messi in un database della società che fa Skype e poi, chissà che ci fanno :)

Ho provato a dare un occhio anche con ltrace, Skype non parte dicendo di reinstallarlo perché l'eseguibile è corrotto! Non so come ltrace operi, ma non così diversamente da strace, penso. O forse sì.

Qualcuno giustificava Skype dicendo che può succedere per programmi che voglioni sapere il nome dell'utente; e lo vogliono chiaramente per poter accedere alla sua cartella, dove si trova .Skype che contiene i dati per utente di Skype. Diciamo che è logico, ma se lo facesse attraverso la variabile $HOME sarebbe molto meglio. Con strace cmq non si capisce se l'accesso al file di password è diretto, cioè è proprio nel codice di Skype che c'è scritto open, oppure no. Perché, poi, Skype vuole sapere i device montati? ...

Accesso a passwd

Per capire meglio la cosa, è il caso di improntare un paio di test. Apro l'editor e scrivo qualche linea di codice...

#include <stdio.h>
#include <pwd.h>
#include <stdlib.h>

int main()
{
  struct passwd *p;
  char *e;

  p = getpwuid(getuid());

  if ( p != NULL )
  {
      printf("Name %s\nPassword %s\nGECOS %s\nHome %s\nShell %s\n\n",
              p->pw_name,
              p->pw_passwd,
              (p->pw_gecos != NULL) ? p->pw_gecos : "?",
              (p->pw_dir != NULL) ? p->pw_dir : "?",
              (p->pw_shell != NULL) ? p->pw_shell : "?"
            );
  }

  e = getenv("HOME");
  printf("Home %s\n", (e!=NULL)? e : "???" );
}

Compilato ed eseguito questo dà un output simile al seguente (per ovvi motivi ho cambiato il contenuto, eccetto del campo Password, quello appare proprio così per via dello shadowing)

Name UserName
Password x
GECOS IlMioNome
Home /home/UserName
Shell /bin/bash

Home /home/UserName

E se usiamo strace come prima su questo programmino, otteniamo:

open("/etc/nsswitch.conf", O_RDONLY)    = 3
read(3, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1233
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/etc/passwd", O_RDONLY)           = 3

Bingo! Ad ogni modo l'uso di getenv non dà adito a nessun sospetto; il problema può essere se la variabile HOME non è impostata. Si potrebbe scrivere del codice che usa la tecnica getpwuid solo se non è impostata la variabile HOME (perché fare così?)

Chi ci assicura però che sia proprio per via di getpwuid? possiamo scrivere un codice che dà lo stesso risultato... Il vero risultato che dovremmo emulare è (almeno sul mio sistema)

open("/etc/passwd", O_RDONLY)           = 3
fcntl64(3, F_GETFD)                     = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
_llseek(3, 0, [0], SEEK_CUR)            = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=1405, ...}) = 0
mmap2(NULL, 1405, PROT_READ, MAP_SHARED, 3, 0) = 0x40017000
_llseek(3, 1405, [1405], SEEK_SET)      = 0
munmap(0x40017000, 1405)                = 0
close(3)                                = 0

Se il pattern di Skype non fosse questo potremmo sospettare... se lo è, potremmo ancora credere che lo imiti intenzionalmente bene? Ci domandiamo, ma questo Skype funziona su sistemi Unix non Linux? (perché _llseek è specifica di Linux e dobbiamo credere che Skype non vi acceda direttamente, se è un eseguibile anche per sistemi unix)

Con strings skype |egrep getpwuid possiamo tranquillizzarci, così come con strings skype |egrep etc (a meno che non hanno criptato la stringa!)

Per concludere, direi che si può stare tranquilli. Mi preoccupa più l'accesso a mtab, ma deve essere per motivi simili, cioè per via della chiamata a una funzione per ottenere informazioni innocue.

Accesso profili Firefox da parte di Skype

Pur avendo Firefox la versione di Skype 1.1.0.13 che ho sembra non provare ad accedere a niente di Firefox, credo di aver cercato sufficientemente bene. A riguardo dunque non posso fare nessun test; o vedendola in un altro modo, i test che ho fatto non hanno rivelato il problema.

Accesso a /etc/mtab

Un'altra cosa che forse non piace è che Skype si interessi di tutti i device montati, poiché accede a /etc/mtab. Ora, secondo me Skype dovrebbe solo interessarsi a dove poter mettere i suoi dati, e questo, una volta saputa la home dell'utente, è banale. Sicuramente anche questo è un effetto collaterale di qualche funzione di sistema.

Il seguente programmino accede appunto a tutte le entrate dell'mtab; c'è solo un problema: per poterlo fare bisogna specificare il file, e una ricerca con strings in Skype non ha rivelato niente di ciò... dunque mi chiedo quale altra funzione usi che possa alla fine voler accedere all'mtab.

#include <stdio.h>
#include <mntent.h>

#define SHOW(x,y) ( ((x)!=NULL) ? (x) : (y) )

int main()
{
  FILE *m = NULL;
  struct mntent *e;

  m = setmntent("/etc/mtab", "r");
  if ( m != NULL )
  {
     while( (e=getmntent(m)) != NULL )
     {
        printf("Name of mounted file system: %s\n"
               "File system path prefix: %s\n"
               "Mount type: %s\n"
               "Mount options: %s\n"
               "Dump frequency in days: %d\n"
               "Pass number on parallel fsck: %d\n\n",
               SHOW(e->mnt_fsname, "?"),
               SHOW(e->mnt_dir, "?"),
               SHOW(e->mnt_type, "?"),
               SHOW(e->mnt_opts, "?"),
               e->mnt_freq, e->mnt_passno);
     }
     endmntent(m);
  }

Questo programmino, visto con strace, dà appunto un

open("/etc/mtab", O_RDONLY)             = 3

Ma non posso dire bingo, visto che come detto sembra essere necessaria una stringa che dovrebbe essere trovata in Skype e che invece non trovo... Se fosse criptata bisognerebbe davvero preoccuparsi!

Preso da sconforto, ho usato readelf per avere l'elenco dei simboli e presumibilmente delle funzioni (dinamicamente linkate) usate da Skype. Scartate le funzioni Xlib, zlib etc., a parte qualche funzione matematica (tipo floor, log10 ...!), funzioni pthread, getpid e altre simili e familiari, non ho visto niente che mi ispiri che possa accedere a mtab...

Possibile che funzioni come realpath, getcwd possano accedere a mtab? Ho provato dunque a fare un un programmino e il responso è stato... niente bingo...

Per ora ho finito le risorse.


Home page