The Effect of Code Obfuscation on Human Program Comprehension

Lo studio analizza come l'offuscamento del codice influenzi la comprensione umana attraverso un compito di previsione degli output, rivelando che tale pratica aumenta generalmente i tempi di ragionamento e riduce l'accuratezza, ma con effetti non monotoni che variano tra Python e JavaScript e che spostano i partecipanti da un ragionamento euristico rapido a processi più deliberati.

Anh H. N. Nguyen, Jack Le, Ilse Lahnstein Coronado, Tien N. Nguyen

Pubblicato Tue, 10 Ma
📖 5 min di lettura🧠 Approfondimento

Each language version is independently generated for its own context, not a direct translation.

Ecco una spiegazione semplice e creativa dello studio, pensata per chiunque, anche senza competenze tecniche.

Immagina di dover leggere una ricetta per cucinare una torta. Se la ricetta è scritta chiaramente ("2 uova", "farina", "zucchero"), la capisci subito. Ma cosa succede se qualcuno prende quella ricetta e:

  1. Cambia i nomi degli ingredienti in cose senza senso (es. "X", "Y", "Z").
  2. Scrive i nomi degli ingredienti in modo ingannevole (es. chiama il sale "Zucchero" e lo zucchero "Sale").
  3. Mescola l'ordine dei passaggi in modo caotico, costringendoti a saltare avanti e indietro nel foglio per capire cosa fare.

Questo è esattamente ciò che gli autori dello studio hanno fatto con il codice dei computer, ma invece di una torta, stavano cercando di capire come gli esseri umani capiscono (o non capiscono) i programmi informatici quando questi vengono "oscurati" (obfuscated).

Il Grande Esperimento: Una Gara di Indovinelli

I ricercatori hanno messo 50 studenti davanti a dei piccoli programmi scritti in Python e JavaScript. Loro dovevano indovinare il risultato finale del programma (come se dovessero dire: "Se metto questi ingredienti, che torta esce?").

Hanno creato 5 livelli di difficoltà, come se fossero livelli in un videogioco:

  • Livello 0 (La ricetta originale): Tutto chiaro e leggibile.
  • Livello 1 (Nomi strani): Hanno cambiato i nomi delle variabili in cose inutili (es. var_123).
  • Livello 1b (Nomi bugiardi): Hanno usato nomi che sembrano sensati ma mentono (es. chiamare una funzione che calcola la somma "calcola_media"). È come se la ricetta dicesse "Aggiungi il sale" ma intendesse lo zucchero.
  • Livello 2 (Struttura rotta): Hanno mescolato l'ordine delle istruzioni, rendendo difficile seguire il flusso logico.
  • Livello 3 (Il caos totale): Hanno combinato nomi strani e struttura rotta.

Cosa hanno scoperto? (Le Sorprese)

Ecco le scoperte principali, spiegate con delle metafore:

1. Più è complicato, più ci si impalla (ma non sempre!)

La logica comune dice: "Più rendi il codice difficile, più è facile da proteggere".

  • Per il JavaScript: È vero. Più oscuravano il codice, più gli studenti sbagliavano e impiegavano più tempo. È come se avessero rimosso le indicazioni stradali: ci si perde di più.
  • Per il Python: È successo qualcosa di strano! In alcuni casi, rendere il codice più "sporco" ha aiutato gli studenti a fare meglio.
    • L'analogia: Immagina di leggere un libro dove i nomi dei personaggi sono nomi reali (es. "Mario", "Luigi"). Se il libro è una storia strana, potresti fare confusione pensando che Mario sia il protagonista perché è un nome comune. Se invece il libro usa nomi strani (es. "X", "Y"), sei costretto a leggere attentamente la trama per capire chi fa cosa. A volte, togliere i "nomi famosi" ti costringe a pensare meglio, invece di fare supposizioni veloci.

2. Il Cervello ha due modalità: "Pilota Automatico" vs "Pilota Manuale"

Gli scienziati usano la teoria dei "Due Sistemi" di pensiero:

  • Sistema 1 (Pilota Automatico): Veloce, intuitivo, basato su abitudini. Quando vedi una ricetta chiara, il tuo cervello dice "Ah, so cosa fare!" e va veloce.
  • Sistema 2 (Pilota Manuale): Lento, faticoso, analitico. Quando la ricetta è confusa, devi fermarti, leggere ogni riga e ragionare.

L'oscuramento del codice forza il cervello a passare dal Pilota Automatico al Pilota Manuale.

  • Il risultato: Chi risponde troppo velocemente (Sistema 1) sbaglia spesso sui codici oscurati perché si fida delle apparenze. Chi rallenta e ci pensa su (Sistema 2) va meglio.
  • Il paradosso del tempo: Se ci si pensa troppo a lungo, si sbaglia di nuovo! Significa che il cervello è andato in tilt, confuso. C'è un "tempo perfetto" (né troppo veloce, né troppo lento) per avere la massima precisione.

3. L'esperienza non è tutto (e a volte è un ostacolo)

Hanno scoperto che essere esperti in un linguaggio non aiuta necessariamente a capire un linguaggio diverso quando è oscurato.

  • L'analogia: Se sei un esperto di guida in Italia (dove si guida a destra), potresti fare più fatica a guidare in Inghilterra (dove si guida a sinistra) se la strada è piena di segnali confusi. Il tuo "pilota automatico" ti dice di girare a destra, ma lì è sbagliato.
  • Gli esperti di Python, quando provavano a leggere JavaScript oscurato, facevano peggio dei principianti! Perché? Perché i loro "istinti" (Sistema 1) erano troppo forti e li portavano a fare errori basati su abitudini sbagliate. I principianti, non avendo abitudini forti, erano costretti a usare il "Pilota Manuale" (ragionare passo dopo passo) e spesso avevano più successo.

In sintesi: Perché è importante?

Questo studio ci dice che proteggere il codice non è solo una questione di matematica o di complessità tecnica, ma di psicologia umana.

  • Se vuoi proteggere un codice da un umano, non basta renderlo "complesso" in senso matematico.
  • A volte, cambiare i nomi delle variabili in modo ingannevole (come il Livello 1b) è più efficace che mescolare tutto, perché inganna l'intuizione veloce delle persone.
  • Ma attenzione: ciò che funziona per il codice JavaScript potrebbe non funzionare per il Python. Ogni linguaggio ha le sue "trappole" mentali.

In conclusione, gli hacker umani non sono computer: hanno abitudini, trappole mentali e modi diversi di pensare. Per proteggerci davvero, dobbiamo capire come il nostro cervello reagisce quando qualcuno ci prova a confondere.