Come posso impedire al codice non autorizzato di accedere al mio assembly in .NET 2.0?

StackOverflow https://stackoverflow.com/questions/421137

  •  05-07-2019
  •  | 
  •  

Domanda

In .NET 1.x, è possibile utilizzare StrongNameIdentityPermissionAttribute sul tuo assembly per garantire che solo il codice firmato da te possa accedere al tuo assembly. Secondo la documentazione MSDN,

  

In .NET Framework versione 2.0 e successive, richieste di identità   le autorizzazioni sono inefficaci se l'assembly chiamante ha piena fiducia.

Ciò significa che qualsiasi applicazione con piena fiducia può semplicemente aggirare le mie esigenze di sicurezza.

Come posso impedire al codice non autorizzato di accedere al mio assembly in .NET 2.0?

È stato utile?

Soluzione

Come suggerito da Eric, l'ho risolto controllando io stesso la chiave. Nel codice che voglio proteggere, aggiungo la seguente chiamata,

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

Quindi l'implementazione di quel metodo è

  /// <summary>
  /// Ensures that the given assembly is signed by My Company or Microsoft.
  /// </summary>
  /// <param name="assembly"></param>
  private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
  {
     if ( assembly == null )
        throw new ArgumentNullException( "assembly" );

     byte[] pubkey = assembly.GetName().GetPublicKeyToken();
     if ( pubkey.Length == 0 )
        throw new ArgumentException( "No public key token in assembly." );

     StringBuilder builder = new StringBuilder();
     foreach ( byte b in pubkey )
     {
        builder.AppendFormat( "{0:x2}", b );
     }
     string pkString = builder.ToString();
     if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
          pkString != "abababababababab" /* Ivara */ )
     {
        throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
     }
  }

** Nomi e chiavi cambiati per proteggere gli innocenti. Qualsiasi somiglianza con nomi o società reali è semplicemente una coincidenza. *

Altri suggerimenti

Vedi questo articolo:
http: // blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

In particolare questa parte:

  

Nelle versioni recenti di .NET, "piena fiducia significa piena fiducia". Cioè, il codice completamente attendibile soddisfa tutte le richieste, comprese le richieste di cose come "è stato firmato con questa chiave", indipendentemente dal fatto che sia stato effettivamente firmato o meno.

     

Non è un difetto mortale nel sistema di sicurezza? No. Il codice completamente attendibile ha sempre avuto la possibilità di farlo, poiché il codice completamente attendibile ha la capacità di controllare le prove associate a un determinato assembly. Se riesci a controllare le prove, puoi creare un assembly che sembra provenire da Microsoft, nessun problema. (E se hai già un codice dannoso di piena fiducia nel tuo processo, allora hai già perso - non ha bisogno di impersonare assembly firmati Microsoft; ha già il potere di fare tutto ciò che l'utente può fare.)

Apparentemente, i progettisti .Net hanno ritenuto che questo attributo non fosse molto efficace nemmeno per il codice di affidabilità completo in .Net 1.x.

Come indicato da Joel, sei sfortunato per quanto riguarda CAS. Tuttavia, potresti essere in grado di eseguire tu stesso il controllo in qualsiasi metodo tu debba proteggere usando Assembly.GetCallingAssembly () per ottenere un riferimento all'assembly contenente il codice chiamante, quindi controlla manualmente il nome sicuro su quell'assembly.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top