Domanda:
Perché l'offuscamento del sistema operativo si difende da "È un sistema Unix!" non ampiamente implementato?
Indigenuity
2019-12-17 05:42:46 UTC
view on stackexchange narkive permalink

La scena di Jurassic Park a cui si fa riferimento nel titolo è famigerata per quanto possa sembrare ridicola per coloro che sono esperti di tecnologia. Ma illustra anche quello che mi sembra essere un enorme buco nella sicurezza web, in particolare nei dispositivi IoT: non appena gli aggressori scoprono che un server, una telecamera o un baby monitor esegue Linux, conoscono immediatamente i volumi su come funziona. Sanno che comandi come sudo sono grandi bersagli succosi e sanno che l'accesso alla shell porterà con sé molti strumenti utili come ls e cat .

Allora perché l'offuscamento del sistema operativo non è più una cosa? Non sto parlando solo di nascondere la versione nelle intestazioni web. Simile alla minimizzazione o all'offuscamento di JavaScript, sto parlando di cambiare i nomi dei binari e dei percorsi dei file nel sistema operativo stesso. Intere classi di attacchi non sarebbero praticamente inutili se il sistema operativo avesse i comandi ha7TrUO e RRI6e29 invece di sudo e ls ? Immagina un hacker che in qualche modo ha ottenuto l'accesso root remoto: cosa faranno anche se non conoscono alcun comando?

L'implementazione sarebbe abbastanza facile per i compilatori. Prendiamo il caso più semplice di "rinominare questa funzione e tutte le chiamate ad essa". Potresti dare a un compilatore del sistema operativo e un compilatore dell'applicazione gli stessi nomi casuali e sarebbero in grado di parlare tra loro. Ma anche se l'applicazione ha una sicurezza scarsa ed è vulnerabile all'iniezione di bash, tali attacchi sarebbero inutili.

Ovviamente questa tecnica non può essere utilizzata in tutti gli scenari. Mettendo da parte scenari come i server gestiti da amministratori di sistema umani, mi sembra che qualsiasi dispositivo o server gestito dall'automazione sia un ottimo candidato per questa difesa.

Immagino che la domanda debba essere un po 'di più concreto:

  1. L'offuscamento del sistema operativo come descritto è ampiamente utilizzato e non l'ho riscontrato?
  2. Se non viene utilizzato ampiamente, quali sono gli ostacoli pratici o tecnici all'utilizzo?
I commenti non sono per discussioni estese;questa conversazione è stata [spostata in chat] (https://chat.stackexchange.com/rooms/102384/discussion-on-question-by-indigenuity-why-is-this-defense-against-its-a-unix-S).
Si potrebbe progettare un ambiente di compilazione che facesse rinominare automaticamente tutti questi simboli e randomizzasse ogni build.Finché avessi la fonte per tutto, sarebbe stato nuovo, ma non a livello di ricerca difficile.E se lo facessi una volta, lo avresti per sempre.Il debug sarebbe difficile.Ma in un certo senso, mi piace l'idea.Sarebbe un pensiero simile a https://en.wikipedia.org/wiki/Address_space_layout_randomization ma in fase di compilazione invece che in runtime e molto più ambizioso.Più ci penso, più rispetto l'idea.Aumenterebbe la sicurezza per i dispositivi embedded.(Nessun proiettile d'argento però.)
Quattordici risposte:
Mike Ounsworth
2019-12-17 09:50:05 UTC
view on stackexchange narkive permalink

Prima di distruggere la tua idea, lasciami dire che è un'idea davvero interessante ed è stato molto divertente pensarci.

Continua a pensare fuori la scatola e fai domande interessanti!

Va bene, facciamolo!


Facciamo un passo indietro e chiediamoci perché baby monitor esegue Linux in primo luogo? E se non ci fosse un sistema operativo e l'applicazione fosse scritta nel codice del microcontrollore nudo (pensa al codice arduino)? Quindi non ci sarebbe sudo o ls o anche una shell da utilizzare per l'attaccante, giusto?

Non sono un esperto qui, ma Mi aspetto che noi, come industria, abbiamo gravitato verso mettere Linux su qualcosa di abbastanza grande da eseguirlo principalmente per comodità degli sviluppatori:

  1. Riduzione dei tempi di sviluppo: quando si costruisce il WiFi e il Bluetooth compatibili Whizpopper di auto-patching con sincronizzazione cloud amministrata dal Web con app Android e iOS complementari, Linux viene fornito con tutte le librerie, le utilità e i driver necessari per farlo.
  2. Aumento della testabilità: se il dispositivo esegue bash o busybox con una porta SSH, è semplicissimo connettersi e capire cosa è andato storto durante la fase di test del prodotto.

Perché la tua idea di offuscamento funzioni, dovresti è necessario offuscare non solo i nomi delle utilità della riga di comando come sudo e ls , ma anche ogni API del kernel Linux per evitare che l'aggressore cada nel proprio binario compilato che ca carica direttamente il kernel. Quindi diamo un'altra occhiata alla tua idea:

L'implementazione sarebbe abbastanza facile per i compilatori. Prendiamo il caso più semplice di "rinominare questa funzione e tutte le chiamate ad essa". Potresti dare a un compilatore del sistema operativo ea un compilatore dell'applicazione gli stessi nomi casuali e potrebbero parlare tra loro.

Avrai bisogno di fare questa compilazione casuale da solo; altrimenti qualcuno potrebbe cercare le mappature su google.

Quindi, dovrai compilare il kernel dai sorgenti con il tuo "compilatore offuscante" in modo che solo tu conosca le mappature delle API del kernel offuscate. (hai mai costruito il kernel linux dai sorgenti? È sicuramente più un lavoro di routine di docker pull alpine , che è la direzione in cui la cultura dev sembra andare) .

Ma un sistema operativo è più del semplice kernel. Vuoi i driver per il chip wifi Broadcom BCM2837 che arriva su quel dispositivo mini-pc? Avrai bisogno di compilare quel driver sul tuo kernel ofbuscato con il tuo compilatore, se Broadcom ti darà anche il codice sorgente. Allora avrai bisogno di costruire l'intero stack di software GNU wifi e di rete. Di quante altre cose avrai bisogno per trovare la fonte e aggiungere alla tua pipeline di build prima di avere un sistema operativo funzionante?

Oh, e se i repository upstream di una di queste cose emettono una patch, ora sei responsabile della ricostruzione (supponendo che tu abbia salvato i file di mappatura dell'offuscamento del compilatore che corrispondono al tuo binario del kernel ) e distribuendolo ai tuoi dispositivi perché, in base alla progettazione, i tuoi dispositivi non possono utilizzare i binari di patch prodotti dal fornitore.

Oh, e per sventare gli hacker, non ce ne sarà nessuno di questo "Ecco i file binari per Whizpopper 1.4.7" , oh no, dovrai creare una versione offuscata in modo univoco di tutto dal kernel fino per dispositivo che spedisci.


Quindi, alle tue domande:

  1. L'offuscamento del sistema operativo come descritto è ampiamente utilizzato e non l'ho riscontrato?
  2. Se non viene utilizzato ampiamente, quali sono gli ostacoli pratici o tecnici all'utilizzo?

Penso che la risposta sia che ciò che stai descrivendo sconfigge praticamente completamente il scopo di utilizzare componenti software preesistenti se è necessario trovare e creare letteralmente tutto dalla fonte. In realtà potrebbe essere meno impegnativo abbandonare completamente il sistema operativo, fingere che sia il 1960 e scrivere la tua applicazione direttamente nel microcodice della CPU.

Mi piace la sicurezza più della maggior parte degli sviluppatori, ma mi piace f * quello .

Dovresti anche ricostruire ogni singolo strumento, pacchetto e script che utilizza questi comandi e strumenti in modo che esegua la chiamata "offuscata".È un * sacco * di lavoro.
Giorni di tempo di compilazione su Core i7?CLFS si compila molto più velocemente di così: diverse ore al massimo.Ancora più veloce se tutto ciò di cui hai bisogno è kernel + busybox + diverse_small_utilities.Ciò che richiederà davvero tempo è eseguire questa noiosa funzione di rinomina e rimappatura del numero di chiamata di sistema, cercando di non rompere nulla.E perché è un lavoro ingrato compilare il kernel Linux dai sorgenti?Cerchi di evitare il suo `Makefile`?
@Ruslan lol, avrei dovuto sapere che sarei entrato in questo dibattito.Dirò solo che, dato il ritmo e lo stile della cultura di sviluppo odierna, lo sforzo di impostare una pipeline di build Linux personalizzata >> afferrare COTS CentOS e `yum install nodejs`.
Ottima risposta, grazie per aver risposto!Non sono del tutto convinto che il tempo di sviluppo debba essere sacrificato per consentire uno speciale passaggio di compilazione durante un "rilascio".A parte questo, la tua opinione sui driver di dispositivo credo sia una barriera piuttosto ampia.Dubito che possa essere superato senza modifiche sostanziali al sistema operativo.Anche se ora mi chiedo se lasciare solo lo spazio del kernel e offuscare lo spazio utente ...
@Indigenuity, riguardante solo l'offuscamento dello spazio utente: ci sono modi molto più efficaci per proteggere l'elettronica di consumo dei prodotti, come l'impostazione di una password di amministratore casuale per dispositivo e seguire le migliori pratiche consolidate.Inoltre, se un produttore non si preoccupa di utilizzare qualcosa di diverso da "admin123", non è nemmeno interessato a offuscare i comandi.
C'è stato un tempo in cui i baby monitor erano dispositivi puramente analogici, senza codice o computer ...
@MikeOunsworth, la maggior parte delle persone che sviluppano IoT costruisce tutto ciò che va sul dispositivo, inclusi kernel e bootloader e spesso anche la toolchain di compilazione incrociata.È ciò che fanno gli strumenti di sviluppo integrati.Yocto inizia con solo il compilatore C host e Python, Ptxdist di solito ottiene il cross-compilatore precompilato.Le schede ARM richiedono una configurazione specifica della scheda in quanto non hanno alcun BIOS standard, quindi sono necessari alcuni passaggi specifici e per la maggior parte delle schede non si ottengono binari predefiniti.Quindi c'è una toolchain da modificare se qualcuno lo desidera.Il vero problema sarebbe il debug.
Anche se le chiamate di sistema del sistema operativo / IOCTL fossero offuscate, i binari noti potrebbero essere usati per indovinare il modello di offuscamento.Se vedessi un binario che invocava syscall 7551 e poi stampato usando una stringa di formato che assomigliava all'output di `stat`, potrei indovinare abbastanza ragionevolmente che fosse il binario` stat` e il syscall nr di `fstat` o amici lo era7551.
Sulla base della mia esperienza con Gentoo, potresti probabilmente compilare uno stack Whizpopper completo in circa quattro ore, meno se stai usando pacchetti leggeri come uclibc, busybox e lighttpd piuttosto che glibc, lo stack GNU e apache.
"In realtà potrebbe essere meno impegnativo abbandonare completamente il sistema operativo, fingere che sia il 1960 e scrivere l'applicazione direttamente nel microcodice della CPU."- Bene, le persone hanno effettivamente pensato a questo e hanno rilasciato framework come [includeos] (https://www.includeos.org/) (nessuna affiliazione) che sostanzialmente ti consentono di farlo (l'obiettivo previsto sembra essere VM o contenitori similisui server, spogliati di tutto tranne il necessario per portare a termine il lavoro).Non sono sicuro, tuttavia, sulla praticità di distribuire sistemi così minimi all'utente finale ...
@hoffmale Il termine di ricerca per tali sistemi di cui sono a conoscenza è "unikernel";essenzialmente una (serie di) librerie statiche da compilare che fornisce tutte le funzionalità del sistema operativo desiderate dalle applicazioni in uso.
Perdonatemi, ma funzionerà anche se assumiamo "l'offuscamento ideale" (cioè tutto è stato ricompilato)?Gli hacker sono persone e saranno in grado di abbinare le chiamate e potenzialmente ricostruire la mappatura, almeno in parte.Vedi quella cosa chiama quella cosa?Colleghiamo questi punti.E ancora, e ancora.Mi sono preso un grafico!Cosa sembra questo?Facciamo un confronto con alcuni grafici di chiamate a OS / script leggibili .. Oh, ora ho capito, `RRI6e29` è in realtà` ls`!(beh, forse non così schietto ma hai un'idea)
Non sono d'accordo con la tua affermazione che Linux è usato principalmente per comodità degli sviluppatori.Scrivere un sistema operativo da zero per la tua fotocamera connessa a Internet richiederebbe l'implementazione di molti strumenti e librerie di supporto.Qualsiasi livello è difficile da implementare ed è probabile che il tuo sistema sviluppato in casa abbia tonnellate di vulnerabilità poiché non sei un esperto in tutti questi livelli.Prendere un Linux leggero e aggiungere il supporto per il driver della fotocamera personalizzato più un livello per una comoda configurazione web è più sicuro.(e ancora molte aziende non riescono a eseguire la configurazione in modo sicuro!)
"stai guardando ore e ore (forse giorni?) di tempo di compilazione qui anche su un i7" Penso che threadripper sia ora il punto di riferimento per la compilazione di progetti (specialmente quelli che possono essere fortemente parallelizzati).cc @Ruslan
+1 per incoraggiare a continuare a pensare in modo diverso
In particolare, se si utilizza Linux, si dovrebbe rilasciare tutto il codice sorgente o renderlo disponibile su richiesta: "La" Sorgente corrispondente "per un'opera in forma di codice oggetto indica tutto il codice sorgente necessario per generare, installare e (perun lavoro eseguibile) esegui il codice dell'oggetto e modifica il lavoro, inclusi gli script per controllare quelle attività. "Che penso includerebbe le tue mappature ...
@MikeOunsworth Ho una domanda, perché non avere una password prima di tutte le chiamate `(come sudo)`.La configurazione del sistema richiede se si desidera che le chiamate siano protette da password e quale sarebbe la password.Ciò impedisce la modifica del tempo di sviluppo e della testabilità.Naturalmente non sto dicendo che lo sviluppiamo, chiedo solo se pensi che possa essere fattibile.
@Nightwolf Questo è in realtà un passo INDIETRO da `sudo`.Prima di "sudo", se volevi eseguire i comandi di root dovevi conoscere la password di root della macchina ed eseguirli usando "su".`sudo` consente agli utenti di eseguire comandi di root (o, in teoria, eseguire comandi come qualsiasi altro utente, la sua configurazione è estremamente potente e flessibile) digitando _la loro_ password, perché risulta avere un'unica password centrale che fornisce l'accesso a rootpoteri ed è noto a tutti coloro che hanno bisogno di eseguire comandi privilegiati è terribile per la sicurezza.
@FeRD `Questo è effettivamente un passo INDIETRO rispetto a sudo`.Stai presumendo che la password rimuova altre protezioni.No, quello che voglio dire è tutta la sicurezza esistente oltre all'offuscamento sotto forma di password.In alternativa potresti chiamarlo un sale invece di una password.
Si potrebbe progettare un ambiente di compilazione che facesse rinominare automaticamente tutti questi simboli e randomizzasse ogni build.Finché avessi la fonte per tutto, sarebbe stato nuovo, ma non a livello di ricerca difficile.E se lo facessi una volta, lo avresti per sempre.Il debug sarebbe difficile.Ma in un certo senso, mi piace l'idea.Sarebbe un pensiero simile a https://en.wikipedia.org/wiki/Address_space_layout_randomization ma in fase di compilazione invece che in runtime e molto più ambizioso.Più ci penso, più rispetto l'idea.Aumenterebbe la sicurezza per i dispositivi embedded.(Nessun proiettile d'argento però.)
CBHacking
2019-12-17 17:18:28 UTC
view on stackexchange narkive permalink

La risposta di Mike dice fondamentalmente tutto ciò che ho da offrire sul motivo per cui questa è una cattiva idea dal punto di vista dello sviluppo (e, come dice il commento di Ghedipunk, una funzionalità di sicurezza inutilizzabile non fornisce sicurezza). Quindi, invece, parlerò del motivo per cui dal punto di vista della sicurezza non lo faresti mai.

La risposta è in realtà sorprendentemente semplice: è una perdita di tempo e ci sono opzioni decisamente migliori. Ogni stupido scarabocchio IoT (ricorda, la "s" in "IoT" sta per Secure) che non si preoccupa di implementare tali funzionalità di sicuro non andrebbe con un approccio come suggerisci tu.

  1. L'intera idea non funzionerà per limitare le chiamate di sistema. Un utente malintenzionato può semplicemente impostare alcuni registri e invocare un codice operativo e boom, sono nel kernel che eseguono la syscall di loro scelta; chi se ne frega qual è il nome simbolico? Certo, puoi manomettere la tabella syscall per complicare la cosa (se non ti dispiace dover ricompilare tutto e rendere il debug del tuo kernel personalizzato una forma di inferno totale) ma è come offuscare il sistema operativo in uso; perché preoccuparsi quando ci sono così pochi candidati, comunque? Anche se l'autore dell'attacco non vuole decodificare il codice esistente sul sistema, il brute-force dovrebbe essere possibile a meno che lo spazio di ricerca degli indici di chiamata utilizzabili non sia più ampio di quanto io abbia mai visto su un sistema embedded.
  2. Perché offuscare i nomi dei comandi quando puoi semplicemente renderli completamente inaccessibili? Un chroot non funzionerà per i built-in della shell se stai eseguendo una shell , ma funziona bene per tutto il resto e davvero, perché il tuo singolo personalizzato a scopo di app-in-a-box eseguire una shell? Voglio dire, le unità di sviluppo ne avrebbero uno installato, a scopo di test, e forse questo non viene rimosso nella tua immagine di vendita al dettaglio perché sei pigro o pensi di averne bisogno di nuovo. Ma un utente malintenzionato non sarebbe in grado di eseguirlo dal contesto in cui viene eseguita la sua app. Un semplice chroot (o un sandbox / jail / container più complicato) può impedire al programma di eseguire, o addirittura accedere, a qualsiasi file oltre a quelli richiesti per il suo lavoro.
  3. Perché offuscare le API del kernel quando puoi semplicemente rimuovere l'accesso ad esse? Esistono numerosi sistemi di sandboxing che possono limitare ciò che un processo (o i suoi discendenti ... se è consentito crearne) può fare. Vedi https://stackoverflow.com/questions/2146059/limiting-syscall-access-for-a-linux-application
Inoltre, un approccio alla sicurezza ampiamente testato, come il chroot su una popolare distribuzione Linux o OpenBSD, è probabilmente più robusto in natura rispetto a un approccio completamente nuovo, intenzionalmente difficile da testare.Chiusura delle porte non necessarie:; anche un bene.
+1 per "ricorda, la" s "in" IoT "sta per Secure" X ^ D
Se controlli la distribuzione, puoi rimescolare l'ordine delle chiamate di sistema del kernel.Devi solo ricostruire glibc accodently e così via.
Per quanto riguarda il problema 1, il sistema operativo PlayStation 4 lo ha effettivamente fatto.È basato su FreeBSD e gli stessi numeri di syscall sono randomizzati.Ovviamente, non è stato difficile per un hacker scoprire quali numeri di syscall si riferivano a quali syscall, poiché ogni syscall ha un comportamento più o meno unico quando vengono forniti vari argomenti: https://cturt.github.io/ps4.html
Phil Frost
2019-12-18 00:43:31 UTC
view on stackexchange narkive permalink

Se il tuo obiettivo è privare un utente malintenzionato di ls e cat , esiste un'alternativa ancora migliore all'offuscamento: non installare queste utilità.

Anche se non direi che questo è un approccio di implementazione ampiamente , è almeno implementabile. Ad esempio, considera distroless, una raccolta di immagini docker con praticamente nulla al loro interno. Alcuni di loro (come quello per andare) letteralmente non contengono niente . Un attacco a un sistema in esecuzione in un tale contenitore non può ottenere l'accesso alla shell perché non c'è nessuna shell da eseguire.

L'unico modo per ottenere l'accesso alla shell attaccando un'applicazione in tale contenitore è quindi per aggirare il runtime del contenitore, che è progettato per impedire proprio questo.

Anche se ho fornito un esempio di immagine docker, lo stesso concetto può essere applicato ai sistemi operativi in ​​generale. Ad esempio, ls e cat fanno parte del pacchetto coreutils in Debian. Puoi eseguire apt-get remove coreutils ed essere sicuro che un utente malintenzionato non sarà in grado di utilizzare ls o cat come parte di un attacco. Ovviamente questo significa che non puoi nemmeno usarli, e probabilmente ci sono molte altre cose che dipendono da coreutils che dovranno essere rimosse, ma per un dispositivo incorporato o un server che fa solo una cosa che potrebbe andare bene.

Il principio generale è ridurre la "superficie di attacco": più "cose" ha un obiettivo, più facile è scendere a compromessi. Il materiale potrebbe essere porte di rete aperte, righe di codice o binari installati. Se l'obiettivo è aumentare la sicurezza, rimuovere tutte le "cose" non necessarie è un buon inizio.

Probabilmente se avessi un'installazione con ls, cat, docker e non molto altro, la prima cosa che vorrei rimuovere per migliorare la sicurezza sarebbe docker.La maggior parte delle cose sane di IoT utilizza busybox ls, cat se è installato, che è * lo stesso binario * per ogni strumento.
Grazie per avermi fatto conoscere _distroless_, concetto interessante!
Buona fortuna a diagnosticare problemi quando script casuali si interrompono perché non riescono a trovare `cat` ...
@FedericoPoloni: `set -euxo pipefail` e` shellcheck` sono un buon inizio ... e tbh, la maggior parte dei felini di scripting Unix sono candidati per That Notorious Award.
Anni fa Bruce Schneier ha tenuto un discorso a una conferenza tecnica in cui ha spiegato che i sistemi installati dalla sua azienda sulle reti dei propri clienti eseguivano un kernel Linux ridotto senza "bash" o molti altri strumenti che potevano essere utilizzati da un attaccante.Ha dato l'analogia di qualcuno che lascia una cassetta degli attrezzi sotto l'esterno della finestra della loro camera da letto, il che sarebbe una comodità per un ladro.La regola di base è che se non lo _nei_ bisogno, non lo _install_, riducendo così il contenuto di quella cassetta degli attrezzi.
Circa 15 anni fa ho lavorato all'interfacciamento con alcune apparecchiature di terze parti.Una parte del loro sistema era un "vero" sistema embedded, una parte era una scatola Windows che parlava con l'altro sistema da un lato e (essenzialmente) chiamate API remote per il mio sistema dall'altro.Una volta avevano bisogno di aiuto per il debug in base al sistema di test che avevano inviato al mio ufficio.Mi ha fatto collegare il sistema Windows e controllare le cose per loro - ** e aveva tutto, giochi e tutto **.C'era protezione fisica (scatola chiusa a chiave) ma se non fosse stata veramente chiusa sarebbe stata una falla di sicurezza importante.
Tom
2019-12-18 13:06:37 UTC
view on stackexchange narkive permalink

Perché l'offuscamento non è sicurezza e perché l'offuscamento del sistema operativo è fondamentalmente senza senso.

Ci sono solo così tanti sistemi operativi comuni e così tanti modi per fare ipotesi plausibili. Se rilevi che sto eseguendo IIS o MSSQL Server, puoi indovinare quale sistema operativo è in esecuzione sotto.

Anche se in qualche modo riesco a eseguire uno stack che non ti dice nulla sul mio sistema operativo sottostante, e maschera anche ogni altro suggerimento (l'impronta digitale è una cosa), non ho ancora vinto molto.

Per quanto riguarda la sicurezza, sai che sto eseguendo Linux, o anche che sto eseguendo Debian 8, non ti dà molto su cui lavorare, né a me molto di cui preoccuparti. Se sono adeguatamente indurito e rattoppato, potresti sapere quello che vuoi. Se sono su un livello di patch che è stato applicato al museo del software ieri, la tua suite di attacchi mi spalancherà semplicemente provandoli tutti e offuscando il mio sistema operativo ti costringerà solo a provare un paio di exploit inutili in più. In un attacco automatizzato, ti rallenterà per pochi secondi.

L'offuscamento non funziona. Le persone possono scansionarti, darti delle impronte o semplicemente lanciare l'intera libreria di exploit per vedere cosa funziona.

Se perdi tempo in quello che avresti potuto spendere per un effettivo rafforzamento, stai effettivamente danneggiando la tua sicurezza .

Un corretto indurimento funziona. Ho detto sopra che "potresti sapere quello che vuoi" . Ho pubblicato il mio indirizzo IP e la password di root alle conferenze sulla sicurezza in cui ho tenuto un discorso. SSH con accesso root remoto e una serie di servizi abilitati. Macchina SELinux seriamente indurita. Nessuno è mai riuscito a interrompere il mio discorso, anche se una volta una persona è riuscita a inserire un file di testo nella directory principale quando la mia politica non era ancora perfetta.


Addendum: il tuo punto di partenza è stato un film. L'offuscamento è un ottimo dispositivo cinematografico perché una rivelazione del genere dice agli spettatori che l'eroe (o il cattivo) ha trovato qualche informazione e sta quindi facendo progressi. È l'equivalente del computer per scoprire dove si trova la cassaforte, anche se hai ancora bisogno del codice. Non importa se è effettivamente corretto, se trasmette il giusto messaggio emotivo al pubblico.

Stai usando ... Linux con Wine?Comunque, il sistema JP non è stato * intenzionalmente * offuscato;non c'era motivo per cui sarebbe stato, non più di quanto il tuo sistema operativo desktop sia intenzionalmente offuscato.La sicurezza in JP si baserebbe sull'autenticazione (e sulla sicurezza * fisica *), proprio come sui moderni sistemi desktop.
Piccolo cavillo: SQL Server 2019 funziona effettivamente su Linux (e anche su Powershell e ASP.NET).Non conosco nessuno che lo faccia davvero ... ma è possibile.
Roman Odaisky
2019-12-17 21:29:09 UTC
view on stackexchange narkive permalink

Per un esempio estremamente diffuso, Intel Management Engine, che ha il proprio sistema operativo, fa qualcosa del genere, dove esiste un meccanismo di aggiornamento del firmware, ma il firmware deve essere in un formato molto specifico i cui dettagli sono riservati. Sembra coinvolgere la codifica Huffman con parametri sconosciuti. Analogamente alla tua proposta (che è fondamentalmente una crittografia simmetrica del firmware), ME richiede modifiche specifiche al momento della preparazione del firmware e presenta una deviazione di corrispondenza dai meccanismi standard al momento dell'esecuzione.

Hmm.Pensavo che il firmware Intel fosse richiesto per essere firmato dal codice da Intel CA.Hanno bisogno di più protezione oltre a quello?Qual è la minaccia che questo offuscamento impedisce?
L'offuscamento cerca di impedire il reverse engineering, quindi gli aggressori non possono trovare ancora più problemi di sicurezza nella loro implementazione.
O non è impossibile che gli stessi Intel stiano facendo qualcosa di losco che vorrebbero nascondere.
Vale la pena notare che molte [vulnerabilità di sicurezza] (https://en.wikipedia.org/wiki/Intel_Management_Engine#Security_vulnerabilities) esistevano e molto probabilmente esistono ancora in ME.E l'intero offuscamento rende anche più difficile per i ricercatori di sicurezza analizzarlo.
Intel ME è uno scherzo malato
@johndoe Immagino che tu non abbia mai sentito parlare del nuovo "motore di innovazione" Intel.: P
user1169420
2019-12-19 03:28:08 UTC
view on stackexchange narkive permalink

Ciò che stai descrivendo si chiama "Security through Obscurity" ed è un antipattern di sicurezza ampiamente noto. Significa che non è un'idea nuova, piuttosto è un'idea vecchia, cattiva, che le persone che non sono iniziate nella filosofia della sicurezza devono essere istruite in modo da non cadere.

Immagina di progettare una casa per essere sicuro, e l'oscurità del pensiero era una strategia promettente. Tutte le case sono costruite con corridoi e stanze, porte con maniglie, interruttori della luce, ecc. Poiché sono comunemente noti, si potrebbe pensare che ciò non sia sicuro poiché un intruso potrebbe facilmente spostarsi nella casa grazie a questi elementi di costruzione comunemente noti. Potresti provare a ridisegnare i principi della costruzione da zero, sostituire i pomelli delle porte con cubi di rubik, realizzare soffitti a mezza altezza per confondere l'intruso, ecc. Ti ritroverai con una casa in cui è terribile vivere, non può essere mantenuta perché nessun imprenditore vuole nulla a che fare con esso, e peggio di tutto è per niente perché qualsiasi intruso, una volta dentro, può guardarsi intorno con gli occhi e usare il cervello per capirlo. Gli hacker in fondo sono dipendenti dai puzzle.

La soluzione per mettere in sicurezza la tua casa non è avere una costruzione non standard, ma avere serrature migliori, finestre protette, un sistema di sicurezza adeguato, ecc. Non voglio nascondere il tuo oro in un passaggio segreto, perché alla fine Abate e Costello si appoggeranno a quel candelabro e lo apriranno accidentalmente. Metti il ​​tuo oro in una cassaforte con una buona combinazione segreta e un allarme antimanomissione. L'equivalente del computer è avere accesso limitato alle credenziali tramite crittografia a chiave pubblica, ruoli di accesso utente limitati, sistemi di monitoraggio, riduzione dell'area di superficie esposta, mitigazione dei vettori delle minacce di ingresso, ecc.

Gli sforzi per rendere un sistema informatico più oscuro il tuo sistema è più lontano dal supporto, più difficile da ottenere patch di sicurezza , più difficile da utilizzare in modo sicuro .

Modifica: a volte, un po 'di sicurezza attraverso è accettabile, se usato in aggiunta alla sicurezza effettiva. Un esempio comune è l'esecuzione di SSH su una porta alta come 30000 qualcosa. SSH è crittografato e l'accesso è protetto da un'autenticazione con credenziali, questa è la tua vera sicurezza. Ma averlo su una porta alta lo rende meno evidente all'inizio se qualcuno sta eseguendo scansioni veloci. Qualunque cosa più complicata di questa, come cercare di offuscare il tuo sistema operativo, lo renderebbe solo un incubo operativo, che renderebbe più difficili le misure di sicurezza effettive (come essere aggiornati sulle patch).

"un po 'di sicurezza attraverso l'oscurità è accettabile": il tuo esempio di utilizzo di una porta non predefinita non è * sicurezza *, è * comodità *: in questo caso, "non voglio che i miei log ssh siano pieni di tentativi falliti."Nessuna influenza sulla sicurezza.
Hai ragione.Scarsa formulazione da parte mia.
Per ulteriori discussioni sulla sicurezza attraverso l'oscurità, vedere [Non è tutta la sicurezza attraverso l'oscurità?] (/ A / 44096/129883) e [Il ruolo valido dell'oscurità] (/ a / 2431/129883).I commenti sono penetranti su quel secondo collegamento.Per quanto riguarda la modifica delle porte predefinite, ci sono alcune avvertenze, come discusso in [Devo cambiare la porta SSH predefinita sui server Linux?] (/ A / 32311/129883).Ancora una volta, alcune cose utili nei commenti.
@Piskvor L'utilizzo di una porta non predefinita contribuisce alla sicurezza tenendo fuori la confusione casuale.Mio padre mi ha insegnato quando ero molto giovane: le serrature devono tenere fuori la persona media, non il criminale incallito.Sceglierà il tuo lucchetto.romperlo, rompere la finestra e ottenere l'ingresso in quel modo.Detto questo, invece di cambiare la porta SSH su un server, semplicemente non instradare loro le connessioni SSH attraverso il firewall (ad eccezione di un server SFTP progettato per essere connesso a Internet).Consenti agli amministratori legittimi di accedere alla tua VPN per ottenere l'accesso remoto.
** Non mettere SSH su una porta alta. ** Puoi metterlo su una porta non predefinita, certo, ma metterlo su una porta alta consente a un processo locale non root di bloccare il server SSH e collegarsi a quelloporto alto al suo posto.Una porta bassa è importante per i server perché richiede il binding di root (beh, alcune funzionalità fornite con root).
@MontyHarder Questo è esattamente quello che ho scritto: meno spam nel registro degli accessi falliti.Proteggiti da mia sorella minore che prova root: toor?E c'era molta gioia.(Yaay.)
F. Hauri
2019-12-18 16:54:45 UTC
view on stackexchange narkive permalink

Pensa useability

  • Prova a spiegare al tuo nuovo amministratore di sistema che deve premere ha7TrUO all'inizio di sudo , RRI6e29 invece di ls e così via ... Sì, c'è un elenco di traduzioni che devi solo imparare!
  • navigare nella rete locale non deve essere possibile: devi mantenere un elenco cartaceo per mantenere una visione d'insieme !?

  • Se rinomini tutti i comandi critici, dovrai guidarlo per aggiornare il sistema!

  • E come commento di Nick2253, se tu prova a creare un sistema incorporato, quindi offuscare prima di pubblicare il prodotto finale, dovrai testare il prodotto finale.

    • Devi creare uno script fatto in casa per associare tutto offuscamento.
    • Se qualcosa va storto, il debug diventerà complicato.
    • Devi creare script di deoffuscamento fatti in casa , per poter fare alcuni debug.
    • Feed-back personalizzato (con log fi les) dovrà essere deoffuscato .

    In questo modo, aggiungerai uno strato di lavoro importante con nuovi potenziali bug.

    Per pochissimi miglioramenti della sicurezza, guarda oltre

L'oscurità potrebbe farti del male.

Pensa a livello inferiore

  • Anche se provi a rinominare file, funzioni a livello di applicazione e sistema operativo, tutto ciò utilizzerà le librerie standard che verranno chiamate direttamente se l'attaccante inviare file eseguibili binari. Potresti anche considerare di offuscare tutte le librerie standard! (Inclusi filesystem, protocolli di rete ...)

  • Mentre usi un kernel non modificato, useranno variabili standard e spazi dei nomi. Quindi, dovrai creare una versione offuscata del kernel ...

... Quindi collegare tutto insieme!

Bene, anche quando tutto è offuscato, l'applicazione dovrà occuparsi di Internet. L'offuscamento non impedirà bug concettuali su questo!

Oscurità Se non a tutti i livelli, non migliorerà la sicurezza.

Completa oscurità Non è realmente possibile, a causa della necessità di utilizzare protocolli standard per poter gestire Internet.

Pensa a license

Se hai intenzione di distribuire GNU / Linux, devi condividere il codice sorgente come descritto in GNU GENERAL PUBLIC LICENSE GPLv3 e / o GNU LESSER GENERAL PUBLIC LICENSE LGPLv3 (a seconda dell'applicazione e librairies usate). Ciò implicherà la pubblicazione del metodo di offuscamento insieme a ogni prodotto distribuito .

Rispondendo rigorosamente alle tue due domande:

Sono un esperto, ma con un fuoco molto piccolo. Lavorando su molte infrastrutture diverse per piccole imprese, ho fatto alcune scelte alcuni anni fa. L'evoluzione e la storia sembrano confermare le mie scelte, ma è solo il mio punto di vista personale.

L'offuscamento del sistema operativo come descritto è ampiamente utilizzato e non l'ho incontrato?

Quindi davvero non so in quale proporzione l'offuscamento sia ampiamente utilizzato, ma non uso sicurezza per oscurità e consiglio di non farlo.

Se non ampiamente utilizzato, quali sono le barriere pratiche o tecniche all'uso?

Nessuna barriera! È solo controproducente. Il costo del tempo diventa rapidamente gigantesco e il miglioramento della sicurezza è un'esca.

Ovviamente, alcune cose minime sono da fare:

  • Non avviare ssh server se non necessario
  • Non installare sudo , usa permessi , gruppi corretti e una struttura coerente.
  • Mantieni aggiornata la tua infrastruttura globale !!!”

Piccolo campione quando la luce viene sopra l'oscurità

  • Protezione di ssh : bidirezionale.

    • Sposta la porta ssh da 22 a 34567

      • leggero e fatto velocemente, ma

      se un utente malintenzionato li trova, potrebbe esercitare una forza bruta regolare contro questa porta per molto tempo prima che l'utente finale li scopra.

    • installa firewall

      • Più forte, richiede più conoscenza, ma.

      Più sicuro mentre aggiornato.

Questo in realtà non risponde alla domanda di @OP's.Hanno specificamente messo da parte i sistemi gestiti dagli esseri umani, quindi gli argomenti di usabilità non si applicano realmente.
Anche il sistema di incorporamento potrebbe essere mantenuto, modificato e aggiornato.
Ovviamente.E presumo, sulla base della domanda di OP, che quei sistemi gestiti manualmente sarebbero esclusi.In particolare, OP chiama i sistemi "gestiti da automazione" per questo tipo di offuscamento.Ovviamente, le persone sono coinvolte in tutta la gestione del sistema a un certo livello, ma ho pensato che questo significasse sistemi che sono gestiti direttamente dall'automazione;o, in altre parole, dove gli strumenti di automazione astraggono la gestione fino al punto in cui l'offuscamento a livello di sistema operativo sarebbe irrilevante.
@Nick2253 Ne ho aggiunti altri dal mio punto di vista.
Matthew
2019-12-18 23:57:23 UTC
view on stackexchange narkive permalink

Intere classi di attacchi non sarebbero praticamente inutili se il sistema operativo avesse i comandi ha7TrUO e RRI6e29 invece di sudo e ls? Immagina un hacker che in qualche modo ha ottenuto l'accesso come root remoto: cosa faranno anche se non conoscono alcun comando?

Un'alternativa migliore sarebbe semplicemente non installare questi comandi in il primo posto. Non credo che tu abbia bisogno di una shell per eseguire un kernel Linux, anche se questo implica che il tuo processo di avvio sia qualcosa di diverso da sysV-init o systemd.

As altri hanno notato, tuttavia, che si tratta di un compromesso tra sicurezza e facilità di sviluppo. Sfortunatamente, molti produttori di dispositivi si preoccupano molto di più del secondo rispetto al primo.

L'implementazione sarebbe abbastanza facile per i compilatori. Prendiamo il caso più semplice di "rinominare questa funzione e tutte le chiamate ad essa". Potresti dare a un compilatore del sistema operativo e un compilatore dell'applicazione gli stessi nomi casuali e sarebbero in grado di parlare tra loro. Ma anche se l'applicazione ha una scarsa sicurezza ed è vulnerabile all'iniezione di bash, tali attacchi sarebbero inutili.

Non sono sicuro che tu abbia bisogno dell'aiuto del compilatore a tutti. Penso che tu possa ottenere questo risultato principalmente modificando il linker ¹ per applicare una randomizzazione a tutti i nomi dei simboli. Probabilmente sarebbe sufficiente applicare una funzione hash con un sale noto solo al produttore. Non sono sicuro che tu abbia nemmeno bisogno del codice sorgente per farlo, cioè penso che potresti applicare la manipolazione a codice già compilato.

(¹ Penso che questo sia qualcosa di un potrebbe essere necessario modificare il codice oggetto per sostituire i nomi dei simboli, ma questo è ancora più simile al livello assembler, vale a dire, a) non stai facendo tutto il difficile bit di compilazione C / C ++ / ecc. codice eb) non è necessario il codice sorgente C / C ++ / qualunque. OTOH Non sono sicuro che tu possa fare questo genere di cose se il codice del tuo dispositivo è invece qualcosa come Python.)

C'è ancora qualche possibilità di decodificare il processo, tuttavia, e inoltre questo potrebbe violare la GPL² (specialmente GPLv3) a meno che non si distribuisca il sale, il che vanificherebbe lo scopo.

In effetti , "a causa della GPL" è probabilmente il motivo principale per cui non lo vedi; sarebbe difficile da implementare in un modo che sia effettivamente utile oltre a rendere ogni dispositivo diverso . OTOH, ciò significherebbe almeno che gli aggressori possono prendere di mira solo dispositivi specifici anziché essere in grado di sfruttare una vulnerabilità su " qualsiasi dispositivo che esegue Linux xyz".

(² Per semplicità, Userò solo "GPL" dappertutto, ma nota che questo in genere si applica anche per le cose con L GPL.)

Detto questo, nota che la GPL non ti richiede pubblicare il sale perché hai "modificato" le fonti. Se la randomizzazione del nome del simbolo avviene in fase di compilazione, non hai modificato i sorgenti. Il motivo per cui dovresti pubblicare il salt è perché la GPL richiede che gli utenti possano sostituire le proprie versioni di una libreria GPL, cosa che non possono fare se non conoscono il salt. (Come notato, potresti essere in grado di liberarti di questo con GPLv2, ma gli effetti tecnici sono simili a "eseguire solo software firmato", per cui GPLv3 è stata specificatamente scritta.)


In definitiva , potrebbe esserci qualche vantaggio qui, ma non renderai nessun sistema particolare notevolmente più sicuro (è risaputo che la "sicurezza attraverso l'oscurità" generalmente non è una sicurezza affatto). Ciò che puoi ottenere è rendere più difficile il targeting di molti sistemi tramite un singolo vettore.

"Penso che potresti applicare la manipolazione a codice già compilato."È un pensiero molto interessante che influenzerebbe molte altre risposte date qui.Non ho familiarità con l'idea di separare il collegamento dalla compilazione, almeno non al di fuori delle aule universitarie.
Archis Gore
2019-12-20 06:26:17 UTC
view on stackexchange narkive permalink

Disclosure equa: sono il CTO di un'azienda che costruisce proprio questo. De-bias per quello che vuoi.

È davvero possibile costruire completamente un kernel-up di sistema, driver di dispositivo, pacchetti, l'intero stack PER host, più volte al giorno, e può essere abbastanza efficace. Questo è esattamente quello che facciamo e aiutiamo i nostri clienti a farlo. Non siamo gli unici: possiamo dedurre che almeno Google lo fa anche per tutte le sue macchine (riferimento in arrivo).

Ora, se avessi la possibilità di ricostruire da zero per macchina, cosa sono alcune delle cose che puoi cambiare?

Il Kernel Self Protection Project lo consente già attraverso il riordino casuale delle strutture del kernel: https://lwn.net/Articles/722293/. Questo articolo punta anche al famoso scambio in cui Linus Torvalds lo chiama teatro della sicurezza, ma l'autore del progetto (che lavora per Google) commenta: "Bene, Facebook e Google non pubblicano le loro build del kernel. :)"

Ciò porta alla conclusione che almeno Google lo fa e lo considera utile. Possiamo fare più tipi di rimescolamento su un set chiuso? Al livello più fondamentale, perché un virus Windows non funziona su Linux o su un Mac? Perché i formati sono diversi. È tutto x86 sotto, eppure non è lo stesso. E se due Linux fossero diversi in modo simile? Windows vs Linux non è "offuscamento" semplicemente perché non abbiamo molti modi per rendere Linux così diversi come Windows lo è per Linux. Ma non è impossibile, e non è nemmeno così difficile. Prendi l'approccio di KSPP e applicalo alle chiamate di sistema, quindi ricompila tutto in cima a quelle chiamate di sistema. Sarà molto difficile da rompere, almeno non in un flyby.

La tua domanda però riguardava la ridenominazione dei simboli (nomi di eseguibili, librerie, ecc.) Questo ha due aspetti: (a) è è utile? (b) Può essere fatto in modo affidabile?

Stavamo cercando un modo per risolvere una volta per tutte le iniezioni di codice PHP. Nonostante ciò che HackerNews vorrebbe farti credere, le iniezioni di codice PHP non sono un problema risolto al di fuori delle bacheche Internet. Gli sviluppatori, gli amministratori e gli utenti PHP della vita reale sono esposti a un numero continuo di iniezioni di codice.

Quindi abbiamo deciso di provare Polyscripting (open source con licenza MIT permissivamente): https: // github. com / polyverse / polyscripted-php

Condividiamo questo pubblicamente per sollecitare il feedback e gestiamo due siti web, polyscripted.com e nonpolyscripted.com, che fanno esattamente quello che ti aspetteresti in base ai loro nomi. Abbiamo anche assunto pentestri per cercare di romperlo.

E sto appena iniziando a sperimentare con librerie condivise eseguibili e rinominare i simboli esportati su un insieme chiuso (in un contenitore docker, per esempio). Personalmente non penso che questo aggiunga tanto valore, ma aggiungerà un po '? Credo di si. Quindi si tratta di costi. Se puoi ottenere poco valore a un costo ancora più basso, perché non farlo e basta? Questo è esattamente il motivo per cui abbiamo tutti ASLR: non è esattamente la più grande difesa dai tempi del pane a fette, ma se hai già un codice trasferibile e lo riordinerai comunque, perché NON spingerlo al limite e randomizzarlo?

In breve, l'approccio che stai descrivendo è stato tentato da molte persone (inclusi Google, Facebook, il kernel Linux, ecc.), insieme a molti accademici nel campo della difesa dei bersagli mobili e una manciata di aziende come i nostri che stanno cercando di renderlo banalmente consumabile come ASLR.

Ciò sarebbe migliorato se fosse modificato in modo da suonare meno come un comunicato stampa e più come una risposta generica con un taglio "abbiamo esperienza in questo".Puoi concentrarti di più sul concetto e meno sulla tua azienda?
yaroslaff
2019-12-24 17:30:53 UTC
view on stackexchange narkive permalink

Vorrei dire come la vedo dal punto di vista degli hacker.

Sicuramente, se rinominerete tutte le utilità, mi renderà le cose molto più difficili e meno comode, ma cosa potrei fare?

  1. Se ho già accesso alla shell sul sistema, caricarei solo busybox (tutte le utilità di base in un binario) o il set completo di binari di cui ho bisogno per le operazioni di base.

  2. Per aumentare ulteriormente i privilegi, potrei aver bisogno di cercare i binari suid-root, e ce ne sono solo alcuni (sudo, mount, ecc.). L'hacker non può caricare tali file (a meno che non sia già root). Il mio semplice piccolo sistema Linux ha solo 24 binari suid. È molto facile provare ciascuno di essi manualmente.

Ma comunque, sono d'accordo, questo renderebbe più difficile l'hacking di questa scatola. Sarebbe doloroso usare (hackerare) questo sistema, ma possibile. E l'hacker lavora sul sistema per ora, giorno o mese ... ma l'amministratore / utente può lavorare sul sistema per anni e non può ricordare i nomi ha7TrUO e RRI6e29. Forse nessuno tenterà nemmeno di hackerare il sistema, ma l'amministratore ne soffrirà ogni giorno.

Ma ... se rendi la sicurezza troppo alta ma scomoda per l'utente / amministratore, spesso stai abbassando la sicurezza. Ad esempio, se imponi password complesse con più di 20 caratteri, molto probabilmente le password verranno scritte su post-it sul monitor. Se renderai il sistema così offuscato, sarà molto difficile lavorarci su per i buoni utenti. E dovranno fare alcune cose per semplificare la loro vita. Ad esempio, possono caricare il loro binario busybox. Temprorary. E se ne dimenticheranno o lo lasceranno lì intenzionalmente (perché hanno intenzione di usarlo poco dopo).

galaktycznyseba
2019-12-19 15:02:56 UTC
view on stackexchange narkive permalink

In realtà succede, perché le connessioni ssh sono crittografate. Cambiare i nomi di alcuni binari principali non fa altro che questo. Inoltre causerebbe molto caos: ad es. qualsiasi script che fa affidamento su queste utilità viene reso inutilizzabile, oppure è necessario disporre di una sorta di "deoffuscatore" proxy, che finirebbe sicuramente come vettore di attacco. Tuttavia ho visto alcuni server in circolazione che non consentono il login di root, costringendo invece a utilizzare sudo. I nomi utente dei sudoer rimangono in qualche modo segreti. Non sono sicuro di quanto sia sicuro, ma non sono un esperto.

Dusty
2019-12-20 20:12:36 UTC
view on stackexchange narkive permalink

Perché non tutte le porte hanno dieci buchi della serratura, solo uno dei quali funzionava effettivamente come chiave o grimaldello? Risposta: per lo più il fastidio non vale i dieci secondi extra del tempo di un ladro.

Se ci fossero milioni di codice sorgente unico creato in isolamento sistemi operativi, l'oscuramento potrebbe essere comune. In pratica, tuttavia, abbiamo circa quattro basi di codice univoche in uso comune: tutte le informazioni sulle perdite su se stesse in base alla temporizzazione degli eventi e per diverse funzioni del sistema operativo di basso livello in cui i produttori di chip forniscono sequenze di bitcode della macchina prescritte per attivare o accedere a determinate funzionalità della CPU, essi probabilmente hanno tutte brevi sequenze contenenti esattamente lo stesso codice.

Peter - Reinstate Monica
2019-12-18 22:42:25 UTC
view on stackexchange narkive permalink

Se offuschi GNU / Linux su un dispositivo IoT distribuito al pubblico sarai costretto a pubblicare il tuo codice perché è sotto la GPL, o ritirare il dispositivo dal mercato.

Offuscare il software GPL - una strategia che dipende dalla segretezza - non è un'idea praticabile.

Non sono sicuro del motivo per cui questo è sottovoto; ma se le obiezioni sono nella vena dei commenti di Charles: semplicemente rinominare le utilità principali non funzionerà (per un semplice inizio, dovrai modificare gli script di inizializzazione GPL). Sospetto fortemente che dovrai anche ricompilare molti binari che interagiscono con altri binari come il driver del compilatore gcc, ld.so, sh / bash ecc. Tutti gli script di shell e molti file di configurazione devono conoscere i nomi e le posizioni di binari, quindi devono essere modificati.

Tutto questo è GPL e sarai costretto a pubblicare i sorgenti, gli script e i file di configurazione modificati, vanificando così gli sforzi di offuscamento. Se utilizzi il dispositivo solo internamente non c'è alcun obbligo di pubblicare i sorgenti, ma allo stesso tempo il motivo dell'offuscamento è molto più debole: frustrerai soprattutto te stesso.

Certamente non sei obbligato a pubblicare i nomi dei tuoi file - e non ho mai visto nessuno affermare che, ad esempio, un autore che pubblica `someprog.tar.gz.sig` (anche quando ci sono altri detentori di copyright) è tenuto a pubblicarela loro chiave di firma privata per consentire ad altri di riprodurre la firma.Una simile affermazione sarebbe stata derisa dall'aula.
... inoltre, se applichi la patch a qualcosa da usare * solo nel tuo datacenter *, non hai bisogno di pubblicare quella patch;è solo la distribuzione che attiva i requisiti di licenza.
@CharlesDuffy Se modifichi il kernel Linux e il sorgente degli strumenti gnu e gli script di shell GPL (che è ciò che deve essere fatto se capisco correttamente l'OP), compilarlo e metterlo sui dispositivi embedded che spedisci ai tuoi clienti, sicuramenteè necessario pubblicare il codice sorgente che rivelerà tutte le chiamate di sistema laboriosamente offuscate e i binari di GNU.Non ho parlato della firma delle chiavi, né dell'OP, credo.Non è necessario pubblicare nomi di file modificati, vero;ma qualsiasi script o programma * che utilizza * quel binario o script rinominato deve essere modificato e la sua fonte pubblicata.
@CharlesDuffy Se un binario o uno script viene semplicemente rinominato, probabilmente non è necessario pubblicare il nuovo nome;ma qualsiasi * chiamante * dovrà essere modificato.Se il programma o lo script non viene mai utilizzato sul dispositivo incorporato, è probabilmente una buona idea in primo luogo non includerlo nell'immagine fornita.
Sicuro."Spedisci ai tuoi clienti" è una cosa diversa da "usa internamente".Qualcosa può essere ampiamente implementato anche se non è ampiamente implementato * e spedito a client esterni *.
@CharlesDuffy La domanda riguarda specificamente i dispositivi IoT: "sicurezza web, [....] server o telecamera o baby monitor", che implica la distribuzione.
Sì, ti darò la possibilità sulla videocamera o sul baby monitor, certamente.
a) non è necessario spedire la fonte fino a quando non viene richiesto.b) anche se lo hai spedito, perché il destinatario dovrebbe darlo a un hacker?
@ThomasWeller (a) L'hacker lo richiede.(b) Lo dai all'hacker perché lo ha richiesto.
Se il client originale non richiede la fonte, è possibile informare il client che il sistema è già compromesso.Se non fosse stato compromesso, non avrebbe mai avuto la possibilità di leggere l'avviso di copyright della GPL e quindi non avrebbe mai avuto l'opportunità di richiedere la fonte.
@ThomasWeller Non è insolito che terze parti ricevano informazioni su sospette violazioni della GPL e indagano.Suppongo che sia rilevabile che un Linux è in esecuzione su un dispositivo senza hackerarlo.Ci sono attacchi di canale laterale più duri di quello.Ma il mio punto era che un dispositivo diffuso che esegue un Linux non divulgato verrà scoperto e sarà costretto a pubblicare i sorgenti oa rimuoverlo dal mercato.Offuscare Gnu / Linux per IoT non è un'idea realizzabile.
Sebbene questa sia una risposta legale, correlata alla licenza e si applichi specificamente a Linux e ad altri software copy-left, Unix non è Linux (di solito) e questa risposta non si applica ai sistemi operativi in generale, che sembra essere il principalel'essenza della domanda (anche se nomina Unix specificamente come esempio).Infosec e legalità non sono la stessa cosa.
@Ghedipunk L'OP ha detto "non appena gli aggressori scoprono che un server, una telecamera o un baby monitor è in esecuzione ** linux ...". ** Sarei anche sorpreso se potessi offuscare un sistema operativo closed-source perché come ho spiegato lo farestialmeno bisogno di patchare ld.so o equivalente, e probabilmente una miriade di altri processi.
Ehhh, sto solo cercando di dare un suggerimento sul motivo per cui hai ricevuto 5 voti negativi: stai affrontando una domanda di sicurezza dal punto di vista delle licenze.
@Ghedipunk L'OP non ha riflettuto su ciò che la loro idea comporta.Non è praticabile.I problemi legali sono una conseguenza del fatto che è necessario molto di più che solo `mv / bin / nib && mv / nib / bash / nib / hsab` ecc.
Non credo che la GPL sia un fattore in tutto questo.E anche se dovessi pubblicare il risultato, non annullerebbe la protezione.Perché chi, sano di mente, codificherebbe i nuovi nomi di file casuali?Creeresti una funzione di traduzione, proprio come *** qualsiasi *** processo di offuscamento.Non devi pubblicare, sotto GPL, il risultato e, anche se lo facessi, pubblichi ogni singolo risultato randomizzato?No, e anche se lo facessi, un utente malintenzionato dovrebbe trovare e individuare la versione con cui sta lavorando.
user253751
2019-12-19 23:43:16 UTC
view on stackexchange narkive permalink

I compilatori (in realtà, i linker) lo fanno già. È uno dei motivi principali per cui il reverse engineering è difficile.

Nel tuo codice sorgente potresti avere queste funzioni:

  void print_hello () {printf ("Hello! \ N ");} void print_hello_twice () {print_hello (); print_hello ();}  

Ecco come si occupano di essere compilati in un programma:

  0x400582 push rbp0x400583 mov rbp, rsp0x400586 mov edi, 0x4006340x40058b chiama 0x4004900x400590 nop0x400591 pop rbp0x400592 ret0x400593 premi rbp0x400594 mov rbp, rsp0x400597 chiama 0x4005820x40059c chiama 0x4005820x4005a1 nop0x4005a2 pop rbp0x4005a3 mov rbp, rsp0x400597 chiama 0x4005820x40059c chiama 0x4005820x4005a1 nop0x4005a2 pop rbp0x4005a3  0x400582 ,  printf  ora si chiama  0x400490  e  print_hello_twice  ora si chiama  0x400593 . A tutte le chiamate sono stati dati anche gli stessi nomi casuali, in modo che le funzioni siano in grado di chiamarsi a vicenda.  

Tuttavia, il linker è in grado di farlo solo all'interno di un programma, poiché collega un programma alla volta .

La compilazione non è offuscamento: [Obfuscation and Decompilation] (https://jonskeet.uk/csharp/obfuscation.html), [Obfuscating C-based baries to avoid decompilation] (https://stackoverflow.com/a/2273676/1765658).
@F.Hauri Fa quello che chiede il richiedente, non è vero?Ma solo entro i confini di un singolo programma.
Questo * non * è ciò che chiede l'OP.La tua risposta è che "questo è già fatto", il che, se fosse vero, renderebbe discutibile la domanda.Il contesto è: "Sto parlando di cambiare i nomi dei binari e dei percorsi dei file nel sistema operativo stesso" e dei comandi menzionati nel post.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...