Il programmatore associato ha usato le peggiori pratiche di programmazione

37

So che sembra strano dirlo, ma un collega programmatore al lavoro ha deliberatamente utilizzato un paio di cattive pratiche di programmazione apposta! Spiegherò. Prima lasciatemi dire che è un ragazzo intelligente e per la maggior parte scrive codice intelligibile.

Gli è stato chiesto di implementare la licenza su un progetto di applicazione web scritto in Java. Dal momento che è Java, se lo si volesse davvero, si potrebbe probabilmente hackerare i barattoli e leggere i nomi delle classi e dei metodi scritti all'interno. La sua soluzione a questo problema consisteva nel chiamare alla lettera goffamente variabili e metodi nomi meno che ovvi e collocarli in classi già congestionate piuttosto che generare nuove classi.

La sua giustificazione era che se un hacker voleva cambiare alcune classi per aggirare i controlli di licenza (e quindi ottenere una copia gratuita del prodotto), avrebbe avuto un tempo molto più difficile se non fosse stato ovvio quali metodi eseguono questi particolari compiti. Solo dopo averlo fatto, l'ho affrontato al riguardo, suggerendo che potremmo forse acquistare una sorta di biblioteca di offuscatori per farlo per noi, pur mantenendo buone pratiche di programmazione. Sostiene di non aver avuto il tempo o le risorse per cercare quel tipo di soluzione.

.. Che mi lascia a un dilemma. Cerco una libreria di obfuscator in Java e correggo il suo vecchio codice (che potrebbe essere un po 'approssimativo nel rimodellare il suo codice), o lo lascio così com'è, per quanto questo mi faccia impazzire?

    
posta Neil 05.07.2011 - 15:33
fonte

12 risposte

93

La sicurezza attraverso l'offuscamento non è mai una buona sicurezza. Ci devono essere modi migliori per proteggere la tua proprietà intellettuale. E questo è ciò che tu e il tuo collega dovreste far apparire come una preoccupazione comune con il vostro manager. Se i dirigenti decidono che non vogliono spendere tempo o denaro per migliorare la sicurezza, allora entrambi dovremo convivere con tale decisione (non è il tuo prodotto, è il prodotto dell'azienda) e meglio non spendere (sprecare?) ancora più tempo sull'argomento.

    
risposta data 05.07.2011 - 15:53
fonte
84

Originale: Che cosa dice il tuo capo? Scopri - fallo.

Mi è stato chiesto di elaborare quanto sopra:

Prima di tutto, penso che tu abbia più di un dilemma:

  • Dovresti "correggere" un altro codice per le persone?
  • L'implementazione (qui di A) delle altre persone è abbastanza grave da dover essere sostituita con qualcos'altro?
  • Sarà un offuscatore (da qui B) essere migliore per questo "incorporare la licenza nella nostra applicazione"?

Prima di tutto, visto da un caso aziendale, il problema IS è stato risolto. A è presente ed è - molto probabilmente - una soluzione "abbastanza buona" per il problema. La tua azienda potrebbe essere contenta che sia semplicemente sufficientemente protetta da richiedere uno sforzo deliberato per interromperla.

Ciò significa che anche se non ti piace (e, credimi, vedrai molto peggio durante la tua carriera ) fa ciò che è necessario. Quindi, poiché il problema è risolto, non dovresti "farlo e basta" ma piuttosto convincere la persona incaricata di assegnare il tuo lavoro che il prezzo a lungo termine di questa implementazione sarà abbastanza alto da giustificare un rollback e la scelta di un obfuscator di scorta. Questo richiederà un bel po 'di preparazione da parte tua, e noterai anche che gli obfuscator hanno anche aspetti negativi che devi conoscere (altre risposte trattano bene). Per esempio. le tracce dello stack non sono immediatamente utilizzabili, ecc. Tutto dipende dall'importanza di evitare la pirateria. Si noti che il più difficile da interrompere è quello che richiede l'uso di dongle hardware ed è molto probabilmente più costoso di quello che i clienti vorranno.

Pertanto, questa decisione non è tua, in quanto la tua azienda ha bisogno di utilizzare risorse aggiuntive per andare a B. Quindi devi portare le tue preoccupazioni alla persona responsabile, spiega questo e qualsiasi altro a lungo termine preoccupati abbastanza bene da capire perché lo consideri inferiore al tuo suggerimento. Quindi prendi la decisione, e indipendentemente da ciò che si scopre, rispetti e si comporti di conseguenza in modo professionale. Nota che l'autore originale dovrà probabilmente mantenerlo comunque mentre lo ha scritto e se se ne va o non lo desidera più, puoi sollevare la questione nuovamente.

In altre parole: Che cosa dice il tuo capo? Scopri - fallo.

Nota anche che questo sarebbe stato diverso se avessi sollevato il problema in precedenza in modo che i soldi sprecati per il tempo impiegato per implementare A fossero minori. In altre parole, quando la scelta tra A e B doveva essere fatta.

Infine, vorrei commentare la tua domanda sul "solo correggere il codice di altri popoli". Questa non è una piccola correzione al codice esistente (che trovo valido e incoraggiato, specialmente con i test in atto). È un rollback e una reimplementazione dirompenti, e anche in team con proprietà comuni del codice non sarebbe una cosa accettabile da fare - almeno per me - senza previa approvazione.

Spero che questo chiarisca il mio punto di vista.

    
risposta data 05.07.2011 - 15:38
fonte
13

Do I look for a obfuscator library in Java and fix his old code (which might be a little touchy about remodeling his code), or do I leave it as it, as much as that irks me to no end?

No , tornare indietro a qualcuno e modificare il codice di cui sono responsabili sarebbe un reato peggiore rispetto alla scrittura del codice discutibile per cominciare.

L'hai portato con il programmatore, il tuo prossimo passo è di toglierti il naso o portarlo su con la gestione e poi toglierti il naso.

    
risposta data 05.07.2011 - 15:44
fonte
6

C'è stata una revisione ufficiale del codice di qualsiasi tipo - o lo scontro ha avuto una "revisione del codice" non ufficiale? Direi che dal momento che questo è un argomento delicato e importante come la sicurezza e le licenze, è necessario aumentare la catena. Hai fatto la prima parte - confrontando il programmatore. Tuttavia, ora che non sta ascoltando, puoi / dovrebbe riprenderlo. Se non lo fai, potresti essere parte del problema.

Gli direi che lo farai - questo PU change cambiare idea. In caso contrario, scrivi un'email molto politicamente corretta, ma precisa e concisa sulla situazione al tuo capo e CC il programmatore. Nell'e-mail, chiedi un incontro tra voi tre e / o qualsiasi altra parte partecipante.

Incontra sempre queste cose - ma in modo politico e amichevole.

    
risposta data 05.07.2011 - 15:44
fonte
2

Se riesci a trovare un offuscatore che può offuscare la firma delle classi (nomi dei metodi ecc.), bene, proponi di acquistarlo e usarlo.

Fino ad allora, potresti dover convivere con essa. Ammetto di aver fatto qualcosa di simile in un recente progetto Grails: i controlli delle licenze sono volutamente incorporati nel già grande metodo di accesso, quindi sarebbe piuttosto difficile sostituire il metodo per ignorare il controllo.

    
risposta data 05.07.2011 - 15:44
fonte
2

Può dimostrare che un tale hack è fattibile, o è solo uno scenario ipotetico di cui è piuttosto preoccupato? Può dare una dimostrazione dal vivo di questo lavoro? Dovrebbe provare. Sul serio. Se funziona, dovrebbe essere presentato alla direzione e quindi suggerire di ottenere un offuscatore.

Se un offuscatore non è abbastanza sicuro, hai esaminato altri modi per proteggere il JAR, forse qualcosa come crittografarlo o compilarlo nel codice nativo?

RE: rielaborazione del suo codice: si tratta solo di rinominare? Molti IDE hanno strumenti di refactoring che possono farlo abbastanza facilmente.

    
risposta data 05.07.2011 - 15:59
fonte
2

Indipendentemente dal valore del tuo IP, la cosa intelligente è non manipolare il tuo codice nella speranza di confondere gli hacker. A parte il fatto che sarà un incubo per mantenere il futuro, in realtà non risolve alcun problema. Rende solo più difficile ma non impossibile. Quindi non è davvero una soluzione e gli effetti collaterali sono cattivi. È come prendere medicine che non funzionano e hanno effetti collaterali negativi.

Il tuo problema è come proteggere il tuo IP. Trova una soluzione per questo: obfuscators, server licenze ecc.

    
risposta data 05.07.2011 - 17:18
fonte
1

Mi sono imbattuto in un problema simile quando un altro sviluppatore ha chiamato le nostre routine di codifica / decrittografia str__copy e str__delete (notare il secondo trattino basso). Era zoppo e avrebbe potuto essere fatto meglio, quindi abbiamo aspettato che ci fosse una storia in cui era necessario aggiornare le licenze. La gestione non ha avuto problemi con l'ulteriore manciata di ore perché l'abbiamo descritta come "ripulire così la prossima volta che entreremo in licenza, ci vorrà meno tempo e sarà più sicuro". Problema risolto, nessun sentimento ferito.

    
risposta data 05.07.2011 - 15:50
fonte
1

Il mio primo pensiero è stato il mantenimento di quel codice. Se il codice è già stato offuscato e si è trasferito, buona fortuna sta cercando di ottenere un controllo su quel codice. Sarai quindi l'hacker che sta tentando di decifrare il codice.

Invece raccomanderei di ripulire il codice e usare un obfuscator fa tutto il duro lavoro. A lungo termine avrai un codice molto gestibile e lascerai tutta la complessità folle a chiunque desideri hackerare la tua licenza.

Ricorda che nessun obfuscater è perfetto, e un hacker molto determinato può decodificare qualsiasi cosa, ma almeno sarà solo lui. Inoltre gli obfuscaters aggiungono molta più complessità di quello che probabilmente un ragazzo può.

    
risposta data 05.07.2011 - 18:49
fonte
0

Sono molto d'accordo con le risposte che dovresti chiedere al tuo capo in merito al problema e fare ciò che dice.

Tuttavia un addendum molto importante a queste risposte è che dovresti documentare le tue preoccupazioni in merito sia alla sicurezza che alla manutenibilità. Indipendentemente dal fatto che tu cambi il codice, è importante che le persone sappiano di cosa ti preoccupi e perché. Questo è importante sia in modo proattivo (il tuo capo non può prendere una decisione che non sa nemmeno di dover fare) e in modo difensivo (se / quando un hacker fa buchi nel sistema di licenze poco sicuro, non possono biasimarti per il loro errore.)

    
risposta data 05.07.2011 - 18:57
fonte
0

"Non essere il professionista più esperto di un problema".

In altre parole, dillo al tuo capo e vai da lì. Se stai zitto, e sei la cima del totum su quel segreto, quando arriva la spinta, sarai responsabile. Dì al tuo capo di passaggio e fagli decidere un modo per affrontarlo. In questo modo sei sollevato dall'onere della scelta.

Non dirlo al tuo capo, perché molti manager forse non sono così tecnici, ma fanno quello che facciamo sempre: dai al problema e alle possibili soluzioni i vantaggi / svantaggi di ciascuna di queste soluzioni. Quindi lascia che decidano e che sia approvato. Ecco perché manager / leader vengono pagati i soldi!

    
risposta data 05.07.2011 - 23:01
fonte
0

La semplice verità è che dato abbastanza tempo e risorse tutto può essere rotto. È una semplice funzione di quanto è popolare la tua app. Più popolare è l'hacker più abile che attira e più tempo è dedicato a romperlo. L'offuscamento del codice fornisce proprio questo - un mezzo per aumentare il tempo necessario per romperlo, simile alla crittografia. Quindi se il tuo codice è offuscato richiede che l'hacker sia abile e dedica del tempo ad esso altrimenti si disperherà e si arrenderà. Devi chiederti se la tua app vale la pena a entrambe le estremità.

In realtà è incredibile quanto possa essere difficile decifrare il codice offuscato. Puoi facilmente trasformare un semplice programma in 10 linee C in un assemblaggio di 100 linee attraverso l'offuscamento. Se provi a eseguirne il debug, salterai senza senso nel codice e potresti essere davvero frustrante nel superarlo. Alla fine si romperà ma diventerà davvero difficile e poiché nulla è davvero impossibile è questo il punto. L'offuscamento del codice riduce il numero di persone che sono in grado di romperlo.

Certo, ci sono modi migliori, come cercare di confondere il debugger e non il cracker, ma questo è economico ed efficiente. Tuttavia nominare le cose in modo imbarazzante non basta. È necessario modificare le funzioni di controllo del flusso di controllo che in realtà non fanno nulla per il codice generale, ma aumentano le dimensioni e la complessità di esso: chiamate funzioni fittizie il cui valore di ritorno non è utilizzato da nessuna parte, da funzioni interne che fanno veramente qualcosa. Puoi già vedere come questo può diventare veramente confuso.

Hai qualcosa che l'aggressore non ha. Il codice sorgente originale. Trova un modo per organizzarlo meglio per te.

    
risposta data 07.07.2011 - 10:55
fonte

Leggi altre domande sui tag