Difference between revisions of "Germany/Projekte/Top 10 fuer Entwickler-2013/A4-Unsichere direkte Objektreferenzen"

From OWASP
Jump to: navigation, search
(Support of changed 'Top_10_2010_Developer_Edition_De:TopTemplate' and 'Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate'using Template 'LanguageFile')
m (Überschrift mithilfe 'Top_10_2010:SubsectionColoredTemplate' hinzugefügt)
(21 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Top_10_2010_Developer_Edition_De:TopTemplate
+
{{Top_10_2013_DeveloperEdition:TopTemplate
     |useprev=PrevLink_Germany_Projekte
+
     |useprev=2013PrevLinkDeveloperEdition
     |usenext=NextLink_Germany_Projekte
+
     |usenext=2013NextLinkDeveloperEdition
     |prev=Top_10_fuer_Entwickler/A3_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
+
     |prev=A3-{{Top_10_2010:ByTheNumbers
 
               |3
 
               |3
               |language=de
+
               |year=2013
               |year=2010}}
+
               |language=de}}
     |next=Top_10_fuer_Entwickler/A5_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
+
     |next=A5-{{Top_10_2010:ByTheNumbers
 
               |5
 
               |5
               |language=de
+
               |year=2013
               |year=2010}}
+
               |language=de}}
 +
    |year=2013
 +
    |language=de
 
}}
 
}}
== Seite in Bearbeitung (BAUSTELLE!!) ==
 
  
== A4 Unsichere direkte Objektreferenzen ==  
+
{{Top_10_2010:SubsectionColoredTemplate
 +
      |A4 {{Top_10_2010:ByTheNumbers
 +
              |4
 +
              |year=2013
 +
              |language=de}}
 +
      ||year=2013
 +
}}
  
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate}}
+
{{Top_10_2010:SummaryTableHeaderBeginTemplate|type=images|year=2013|language=de}}
{{Top_10_2010:SummaryTableValue-1-Template|Ausnutzbarkeit|EINFACH}}
+
  {{Top_10:SummaryTableTemplate|exploitability=1|prevalence=2|detectability=1|impact=2|language=de|year=2013}}
{{Top_10_2010:SummaryTableValue-2-Template|Verbreitung|HÄUFIG}}
+
{{Top_10_2010:SummaryTableValue-1-Template|Auffindbarkeit|EINFACH}}
+
{{Top_10_2010:SummaryTableValue-2-Template|Auswirkung|MITTEL}}
+
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Denken Sie an verschiedene Typen von Nutzern, die auf Ihr System zugreifen. Gibt es Nutzer, die nur eingeschränkten Zugriff auf bestimmte Daten Ihres Systems haben sollen?</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Denken Sie an verschiedene Typen von Nutzern, die auf Ihr System zugreifen. Gibt es Nutzer, die nur eingeschränkten Zugriff auf bestimmte Daten Ihres Systems haben sollen?</td>
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Der Angreifer ist autorisiert, auf ein Systemobjekt zuzugreifen. Durch einfache Änderung eines Parameters kann er auf Ob- jekte zugreifen, für die er nicht autorisiert ist.</td>
+
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Der Angreifer ist autorisiert, auf ein Systemobjekt zuzugreifen. Durch einfache Änderung eines Parameters kann er auf Objekte zugreifen, für die er nicht autorisiert ist.</td>
 
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Webanwendungen nutzen oft den internen Namen oder die Kennung eines Objektes, um auf dieses zu verweisen. Anwendungen prüfen dabei nicht immer, ob der Nutzer für den Zugriff auf diese autorisiert ist. Dies führt zu unsicheren direkten Objektreferenzen. Tester können Parameter ändern, um diese Schwachstellen zu entdecken. Code-Analysen zeigen schnell, ob die Autorisierung in geeigneter Weise geprüft wird.</td>
 
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Webanwendungen nutzen oft den internen Namen oder die Kennung eines Objektes, um auf dieses zu verweisen. Anwendungen prüfen dabei nicht immer, ob der Nutzer für den Zugriff auf diese autorisiert ist. Dies führt zu unsicheren direkten Objektreferenzen. Tester können Parameter ändern, um diese Schwachstellen zu entdecken. Code-Analysen zeigen schnell, ob die Autorisierung in geeigneter Weise geprüft wird.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Diese Schwachstelle gefährdet alle Daten, die via Parameter referenziert werden können. Angreifer können auf alle verfügbaren Daten dieser Art zugreifen, außer der Namensraum ist dünn besetzt.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Diese Schwachstelle gefährdet alle Daten, die via Parameter referenziert werden können. Angreifer können auf alle verfügbaren Daten dieser Art zugreifen, außer der Namensraum ist dünn besetzt.</td>
Line 29: Line 33:
 
{{Top_10_2010:SummaryTableEndTemplate}}
 
{{Top_10_2010:SummaryTableEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=4|year=2010|language=de}}   
+
{{Top_10:SubsectionTableBeginTemplate|type=main}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=example|position=firstLeft|risk=4|year=2013|language=de}}   
 
Die Anwendung nutzt ungeprüfte Daten in einem SQL-Aufruf, der Account-Informationen abfragt:
 
Die Anwendung nutzt ungeprüfte Daten in einem SQL-Aufruf, der Account-Informationen abfragt:
{{Top_10_2010:ExampleBeginTemplate}}String query = "SELECT * FROM accts WHERE account = ?";<br/>    PreparedStatement pstmt = connection.prepareStatement(query , ... );<br/><span style="color:red">pstmt.setString( 1, request.getParameter("acct"));</span><br/>ResultSet results = pstmt.executeQuery();{{Top_10_2010:ExampleEndTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}String query = "SELECT * FROM accts WHERE account = ?";<br/>    PreparedStatement pstmt = connection.prepareStatement(query , ... );<br/><span style="color:red">pstmt.setString( 1, request.getParameter("acct"));</span><br/>ResultSet results = pstmt.executeQuery();{{Top_10_2010:ExampleEndTemplate}}
 
Ein Angreifer ändert den Parameter ‘acct’ im Browser, um beliebige Zugangsnummern abzufragen. Wenn keine Prüfung erfolgt, können Angreifer nicht nur auf ihren eigenen, sondern auf jeden gewünschten Account Zugriff erhalten.
 
Ein Angreifer ändert den Parameter ‘acct’ im Browser, um beliebige Zugangsnummern abzufragen. Wenn keine Prüfung erfolgt, können Angreifer nicht nur auf ihren eigenen, sondern auf jeden gewünschten Account Zugriff erhalten.
{{Top_10_2010:ExampleBeginTemplate}}<nowiki>http://example.com/app/accountInfo?acct=notmyacct</nowiki>{{Top_10_2010:ExampleEndTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}<nowiki>http://example.com/app/accountInfo?acct=notmyacct</nowiki>{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=4|year=2010|language=de}}  
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=howPrevent|position=right|risk=4|year=2013|language=de}}  
Um unsichere direkte Objektreferenzen zu verhindern, muss der Schutz eines jeden Objektes (z.B. Objektnummer, Datei-name), das für Nutzer erreichbar ist, gewährleistet werden:
+
Um unsichere direkte Objektreferenzen zu verhindern, muss der Schutz eines jeden Objektes (z.B. Objektnummer, Dateiname), das für Nutzer erreichbar ist, gewährleistet werden:
 
# <b>Indirekte Objektreferenzen verwenden!</b> Dies verhindert den direkten Angriff auf nicht autorisierte Ressourcen. So sollte eine Auswahlbox mit sechs für den Nutzer verfügbaren Objekten die Ziffern 1 bis 6 als Referenzen enthalten, statt deren echte Datenbankschlüssel. Die Anwendung muss dann diese indirekten Objektreferenzen den echten Datenbankschlüsseln zuordnen. Die OWASP ESAPI enthält Referenzzuordnungen für sequentiellen wie wahlfreien Zugriff, die von Entwicklern zur Vermeidung direkter Referenzen genutzt werden können.
 
# <b>Indirekte Objektreferenzen verwenden!</b> Dies verhindert den direkten Angriff auf nicht autorisierte Ressourcen. So sollte eine Auswahlbox mit sechs für den Nutzer verfügbaren Objekten die Ziffern 1 bis 6 als Referenzen enthalten, statt deren echte Datenbankschlüssel. Die Anwendung muss dann diese indirekten Objektreferenzen den echten Datenbankschlüsseln zuordnen. Die OWASP ESAPI enthält Referenzzuordnungen für sequentiellen wie wahlfreien Zugriff, die von Entwicklern zur Vermeidung direkter Referenzen genutzt werden können.
 
# <b>Zugriffe prüfen!</b> Jeder Abruf direkter Objektreferenzen aus nicht vertrauenswürdigen Quellen muss eine Prüfung der Zugriffsberechtigung beinhalten, um die Autorisierung für das angefragte Objekt sicherzustellen.
 
# <b>Zugriffe prüfen!</b> Jeder Abruf direkter Objektreferenzen aus nicht vertrauenswürdigen Quellen muss eine Prüfung der Zugriffsberechtigung beinhalten, um die Autorisierung für das angefragte Objekt sicherzustellen.
</td> </tr>
+
{{Top_10:SubsectionTableEndTemplate}}
</table>
+
  
 
= '''JAVA''' =   
 
= '''JAVA''' =   
<!-- z.Z ohne Template --->
+
<!-- Beispiele für JAVA --->
 
+
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=4|year=2013|language=de}}
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=4|year=2010|language=de}}
+
====Indirekte Objektreferenzen verwenden!====
 
+
;ESAPI<br/>
{{Top_10_2010:ExampleBeginTemplate}}
+
(Beispiel bisher fast unbearbeitet aus ESAPI übernimmen) => tbd
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
Set fileSet = new HashSet();<br/>
 +
fileSet.addAll(...); // add direct references (e.g. File objects)<br/>
 +
AccessReferenceMap map = new AccessReferenceMap( fileSet );<br/>
 +
// store the map somewhere safe - like the session!<br/>
 +
String indRef = map.getIndirectReference( file1 );<br/>
 +
<nowiki>String secureHref = "http://www.your-URL.yourTLD/esapi?file=" + indRef );</nowiki><br/>
 +
...<br/>
 +
// if the indirect reference doesn't exist, it's likely an attack<br/>
 +
// getDirectReference throws an AccessControlException<br/>
 +
// you should handle as appropriate<br/>
 +
String indref = request.getParameter( "file" );<br/>
 +
File file = (File)map.getDirectReference( indref );<br/>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
[http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessReferenceMap.html '''Quelle: ESAPI''']<br/>
  
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=4|year=2013|language=de}}
 +
====Zugriffe prüfen!====
 +
;(A) InjectionChecker für Parameter Prüfung
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
public class InjectionChecker {
 +
:  public static void check(String value)
 +
::    throws InjectionCheckException {
 +
::    // see Topic A1
 +
::    ...
 +
::    if(checkFailed) {
 +
:::      throw new InjectionCheckException("...");
 +
::    }
 +
:  }
 +
}<br/>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;(B) PermissionChecker für Prüfungung der Zugriffsrechte
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
public class PermissionChecker {
 +
:  public void check(String username, Action action,
 +
:::        Class<? extends Object> objectType, String objectId)
 +
::    throws PermissionCheckException{
 +
::    ...
 +
::    if(checkFailed) {
 +
:::      throw new PermissionCheckException("...");
 +
::    }
 +
:  }
 +
}<br/>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;(C) Pseudo Code für Zugriffsprüfung bei direkten Objektreferenzen
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
// Parameter Wert aus dem Request abfragen<br/>
 +
String acct = request.getParameter("acct");<br/>
 +
InjectionChecker.check(acct);<br/>
 +
<br/>
 +
// Informationen für die Zugriffsprüfung zustammenstellen<br/>
 +
String username = getUsername(request);<br/>
 +
Action action = Action.READ; // (e.g. READ, WRITE, DELETE)<br/>
 +
Class<? extends Object> objectType = ObjectBean.class;<br/>
 +
String objectId = acct;<br/>
 +
<br>
 +
// Zufriffsprüfung durchführen<br/>
 +
PermissionChecker permissionChecker = getPermissionChecker();<br/>
 +
check(username, action, objectType, objectId);<br/>
 +
<br/>
 +
// nach erfolgreicher Prüfung kann der Parameterwert<br/>
 +
// verwendet werden<br/>
 +
String query = "SELECT * FROM accts WHERE account_id = ?";<br/>
 +
PreparedStatement pstmt = connection.prepareStatement(query , ... );<br/>
 +
pstmt.setString( 1, acct);<br/>
 +
ResultSet results = pstmt.executeQuery();<br/>
 
{{Top_10_2010:ExampleEndTemplate}}  
 
{{Top_10_2010:ExampleEndTemplate}}  
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=left|title=3|risk=4|year=2013|language=de}}
  
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
  
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=5|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=4|year=2013|language=de}}
 +
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 +
* [https://www.owasp.org/index.php/Top_10_2007-Insecure_Direct_Object_Reference  OWASP Top 10-2007 on Insecure Dir Object References]
 +
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessReferenceMap.html  ESAPI Access Reference Map API]
 +
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessController.html  ESAPI Access Control API] (siehe isAuthorizedForData(), isAuthorizedForFile(), isAuthorizedForFunction() )
  
{{Top_10_2010:ExampleBeginTemplate}}
+
Für weitere Anforderungen an Zugangskontrollen siehe<br/>
 +
: [https://www.owasp.org/index.php/ASVS  ASVS requirements area for Access Control (V4)].
  
 +
{{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}}
 +
* [http://cwe.mitre.org/data/definitions/639.html  CWE Entry 639 on Insecure Direct Object References]
 +
* [http://cwe.mitre.org/data/definitions/22.html  CWE Entry 22 on Path Traversal] (Beispiel für einen Angriff über direkte Objektreferenzen)
 +
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=JAVA
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A3-{{Top_10_2010:ByTheNumbers
 +
              |3
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
 +
 +
= '''.NET''' =
 +
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=4|year=2013|language=de}}
 +
<br/>
 +
;(A) Methoden definieren (im Beispiel ohne Fehlerbehandlung)
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
public static class IndirectReferenceMap
 +
{
 +
:  public static int GetDirectReference(Guid indirectReference)
 +
:  {
 +
::    var map = (Dictionary<Guid, int>)HttpContext.Current.Session["IndirMap"];
 +
::    return map[indirectReference];
 +
:  }
 +
 +
:  public static Guid GetIndirectReference(int directReference)
 +
:  {
 +
::    var map = (Dictionary<int, Guid>)HttpContext.Current.Session["DirMap"];
 +
::    return map == null ?
 +
::      AddDirectReference(directReference)
 +
::      : map[directReference];
 +
:  }
 +
 +
:  private static Guid AddDirectReference(int directReference)
 +
:  {
 +
::    var indirectReference = Guid.NewGuid();
 +
::    HttpContext.Current.Session["DirMap"] = new Dictionary<int, Guid>
 +
::      { {directReference, indirectReference } };
 +
::    HttpContext.Current.Session["IndirMap"] = new Dictionary<Guid, int>
 +
::      { {indirectReference, directReference } };
 +
::    return indirectReference;
 +
:  }
 +
}<br/>
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;(B) Bei der Ausgabe die indirekte Referenz nutzen (Service-Aufruf mit AJAX)
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
service.GetCustomer('<%= IndirectReferenceMap.
 +
: GetIndirectReference(GetCustomerId()) %>', onSuccess, null, null);
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
<br/>
 +
;(C) Bei der Verarbeitung mithilfe der indirekten Referenz auf das originale Objekt zugreifen
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
public Customer GetCustomer(Guid indirectId)
 +
{
 +
:  var customerId = IndirectReferenceMap.GetDirectReference(indirectId);<br/>
 +
...
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
[http://www.troyhunt.com/2010/09/owasp-top-10-for-net-developers-part-4.html '''Quelle: OWASP Top 10 for .NET developers part 4: Insecure direct object reference''']<br/>
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=4|year=2013|language=de}}
 +
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 +
tbd
 +
Text
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=whole|title=3|risk=4|year=2013|language=de}}
 +
tbd
 +
Text
 +
 
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=userImpact|position=left|risk=4|year=2013|language=de}}
 +
(ganze Breite)
 +
Text
 +
 
 +
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=4|year=2013|language=de}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
* [[SQL_Injection_Prevention_Cheat_Sheet | OWASP SQL Injection Prevention Cheat Sheet]]
+
* [https://www.owasp.org/index.php/Top_10_2007-Insecure_Direct_Object_Reference  OWASP Top 10-2007 on Insecure Dir Object References]
* [[Command_Injection | OWASP Injection Flaws Article]]
+
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessReferenceMap.html ESAPI Access Reference Map API]
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html ESAPI Encoder API]
+
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessController.html ESAPI Access Control API] (siehe isAuthorizedForData(), isAuthorizedForFile(), isAuthorizedForFunction() )
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Validator.html ESAPI Input Validation API]
+
 
* [http://www.owasp.org/index.php/ASVS#tab=Downloads ASVS: Output Encoding/Escaping Requirements (V6)]
+
Für weitere Anforderungen an Zugangskontrollen siehe<br/>
* [[Testing_for_SQL_Injection_(OWASP-DV-005) | OWASP Testing Guide: Chapter on SQL Injection Testing]]
+
: [https://www.owasp.org/index.php/ASVS ASVS requirements area for Access Control (V4)].
* [[Reviewing_Code_for_SQL_Injection | OWASP Code Review Guide: Chapter on SQL Injection]]
+
 
* [[Reviewing_Code_for_OS_Injection | OWASP Code Review Guide: Command Injection]]
+
{{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}}
{{Top_10_2010_Developer_Edition_De:SubSubsectionExternalReferencesTemplate}}
+
* [http://cwe.mitre.org/data/definitions/639.html CWE Entry 639 on Insecure Direct Object References]
* [http://cwe.mitre.org/data/definitions/77.html CWE Entry 77 on Command Injection]
+
* [http://cwe.mitre.org/data/definitions/22.html CWE Entry 22 on Path Traversal] (Beispiel für einen Angriff über direkte Objektreferenzen)
* [http://cwe.mitre.org/data/definitions/89.html CWE Entry 89 on SQL Injection]
+
* [http://asafaweb.com/OWASP%20Top%2010%20for%20.NET%20developers.pdf OWASP Top 10 for .NET developers (Troy Hunt)]
</td></tr></table>
+
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=.NET
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A3-{{Top_10_2010:ByTheNumbers
 +
              |3
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
  
 
= '''Test''' =
 
= '''Test''' =
 
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=4|year=2010|language=de}}
+
{{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=4|year=2013|language=de}}
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 
tbd
 
tbd
 
Text
 
Text
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=4|year=2013|language=de}}
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate|year=2013}}
 
tbd
 
tbd
 
Text
 
Text
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=whole|title=3|risk=4|year=2013|language=de}}
 
tbd
 
tbd
 
Text
 
Text
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=userImpact|position=left|risk=4|year=2013|language=de}}
 
(ganze Breite)
 
(ganze Breite)
 
Text
 
Text
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=4|year=2010|language=de}}
+
{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=4|year=2013|language=de}}
</td></tr></table>
+
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab
 +
    |headertab=Test
 +
    |useprev=2013PrevHeaderTabDeveloperEdition
 +
    |usenext=2013NextHeaderTabDeveloperEdition
 +
    |prev=A3-{{Top_10_2010:ByTheNumbers
 +
              |3
 +
              |year=2013
 +
              |language=de}}
 +
    |next=A5-{{Top_10_2010:ByTheNumbers
 +
              |5
 +
              |year=2013
 +
              |language=de}}
 +
    |year=2013
 +
    |language=de
 +
}}
 
<headertabs />
 
<headertabs />
 
+
{{Top_10_2013_DeveloperEdition:BottomAdvancedTemplate
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate
+
 
     |type=0
 
     |type=0
     |useprev=PrevLink_Germany_Projekte
+
     |useprev=2013PrevLinkDeveloperEdition
     |usenext=NextLink_Germany_Projekte
+
     |usenext=2013NextLinkDeveloperEdition
     |prev=Top_10_fuer_Entwickler/A3_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
+
     |prev=A3-{{Top_10_2010:ByTheNumbers
 
               |3
 
               |3
               |language=de
+
               |year=2013
               |year=2010}}
+
               |language=de}}
     |next=Top_10_fuer_Entwickler/A5_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
+
     |next=A5-{{Top_10_2010:ByTheNumbers
 
               |5
 
               |5
               |language=de
+
               |year=2013
               |year=2010}}
+
               |language=de}}
 +
    |year=2013
 +
    |language=de
 
}}
 
}}
 
  
 
[[Category:OWASP Top 10 fuer Entwickler]]
 
[[Category:OWASP Top 10 fuer Entwickler]]

Revision as of 07:13, 17 July 2013

BAUSTELLE! Hier entsteht das deutsche Wiki der OWASP Top 10 fuer Entwickler-2013

← A3-Cross-Site Scripting (XSS)
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

A5-Sicherheitsrelevante Fehlkonfiguration →
A4 Unsichere direkte Objektreferenzen


Bedrohungsquelle
Angriffsvektor
Schwachstellen
Technische Auswirkung
Auswirkung auf das Unternehmen
Application Specific Ausnutzbarkeit
EINFACH
Verbreitung
HÄUFIG
Auffindbarkeit
EINFACH
Auswirkung
MITTEL
Application / Business Specific
Denken Sie an verschiedene Typen von Nutzern, die auf Ihr System zugreifen. Gibt es Nutzer, die nur eingeschränkten Zugriff auf bestimmte Daten Ihres Systems haben sollen? Der Angreifer ist autorisiert, auf ein Systemobjekt zuzugreifen. Durch einfache Änderung eines Parameters kann er auf Objekte zugreifen, für die er nicht autorisiert ist. Webanwendungen nutzen oft den internen Namen oder die Kennung eines Objektes, um auf dieses zu verweisen. Anwendungen prüfen dabei nicht immer, ob der Nutzer für den Zugriff auf diese autorisiert ist. Dies führt zu unsicheren direkten Objektreferenzen. Tester können Parameter ändern, um diese Schwachstellen zu entdecken. Code-Analysen zeigen schnell, ob die Autorisierung in geeigneter Weise geprüft wird. Diese Schwachstelle gefährdet alle Daten, die via Parameter referenziert werden können. Angreifer können auf alle verfügbaren Daten dieser Art zugreifen, außer der Namensraum ist dünn besetzt. Prüfen Sie sorgfältig den geschäftlichen Wert ungeschützt verfügbarer Daten. Berücksichtigen Sie auch die geschäftlichen Auswirkungen, die mit der Veröffentlichung der Schwachstelle verbunden sein können.
Mögliche Angriffsszenarien

Die Anwendung nutzt ungeprüfte Daten in einem SQL-Aufruf, der Account-Informationen abfragt:

String query = "SELECT * FROM accts WHERE account = ?";
PreparedStatement pstmt = connection.prepareStatement(query , ... );
pstmt.setString( 1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery();

Ein Angreifer ändert den Parameter ‘acct’ im Browser, um beliebige Zugangsnummern abzufragen. Wenn keine Prüfung erfolgt, können Angreifer nicht nur auf ihren eigenen, sondern auf jeden gewünschten Account Zugriff erhalten.

http://example.com/app/accountInfo?acct=notmyacct
Wie kann ich 'Unsichere direkte Objektreferenzen' verhindern?

Um unsichere direkte Objektreferenzen zu verhindern, muss der Schutz eines jeden Objektes (z.B. Objektnummer, Dateiname), das für Nutzer erreichbar ist, gewährleistet werden:

  1. Indirekte Objektreferenzen verwenden! Dies verhindert den direkten Angriff auf nicht autorisierte Ressourcen. So sollte eine Auswahlbox mit sechs für den Nutzer verfügbaren Objekten die Ziffern 1 bis 6 als Referenzen enthalten, statt deren echte Datenbankschlüssel. Die Anwendung muss dann diese indirekten Objektreferenzen den echten Datenbankschlüsseln zuordnen. Die OWASP ESAPI enthält Referenzzuordnungen für sequentiellen wie wahlfreien Zugriff, die von Entwicklern zur Vermeidung direkter Referenzen genutzt werden können.
  2. Zugriffe prüfen! Jeder Abruf direkter Objektreferenzen aus nicht vertrauenswürdigen Quellen muss eine Prüfung der Zugriffsberechtigung beinhalten, um die Autorisierung für das angefragte Objekt sicherzustellen.
[edit]

Verteidigungs-Option 1 gegen 'Unsichere direkte Objektreferenzen':

Indirekte Objektreferenzen verwenden!

ESAPI

(Beispiel bisher fast unbearbeitet aus ESAPI übernimmen) => tbd

Set fileSet = new HashSet();
fileSet.addAll(...); // add direct references (e.g. File objects)
AccessReferenceMap map = new AccessReferenceMap( fileSet );
// store the map somewhere safe - like the session!
String indRef = map.getIndirectReference( file1 );
String secureHref = "http://www.your-URL.yourTLD/esapi?file=" + indRef );
...
// if the indirect reference doesn't exist, it's likely an attack
// getDirectReference throws an AccessControlException
// you should handle as appropriate
String indref = request.getParameter( "file" );
File file = (File)map.getDirectReference( indref );

Quelle: ESAPI

Verteidigungs-Option 2 gegen 'Unsichere direkte Objektreferenzen':

Zugriffe prüfen!

(A) InjectionChecker für Parameter Prüfung

public class InjectionChecker {

public static void check(String value)
throws InjectionCheckException {
// see Topic A1
...
if(checkFailed) {
throw new InjectionCheckException("...");
}
}

}


(B) PermissionChecker für Prüfungung der Zugriffsrechte

public class PermissionChecker {

public void check(String username, Action action,
Class<? extends Object> objectType, String objectId)
throws PermissionCheckException{
...
if(checkFailed) {
throw new PermissionCheckException("...");
}
}

}


(C) Pseudo Code für Zugriffsprüfung bei direkten Objektreferenzen

// Parameter Wert aus dem Request abfragen
String acct = request.getParameter("acct");
InjectionChecker.check(acct);

// Informationen für die Zugriffsprüfung zustammenstellen
String username = getUsername(request);
Action action = Action.READ; // (e.g. READ, WRITE, DELETE)
Class<? extends Object> objectType = ObjectBean.class;
String objectId = acct;

// Zufriffsprüfung durchführen
PermissionChecker permissionChecker = getPermissionChecker();
check(username, action, objectType, objectId);

// nach erfolgreicher Prüfung kann der Parameterwert
// verwendet werden
String query = "SELECT * FROM accts WHERE account_id = ?";
PreparedStatement pstmt = connection.prepareStatement(query , ... );
pstmt.setString( 1, acct);
ResultSet results = pstmt.executeQuery();

Verteidigungs-Option 3 gegen 'Unsichere direkte Objektreferenzen':
Referenzen

OWASP

Für weitere Anforderungen an Zugangskontrollen siehe

ASVS requirements area for Access Control (V4).

Andere

Verteidigungs-Option 1 gegen 'Unsichere direkte Objektreferenzen':


(A) Methoden definieren (im Beispiel ohne Fehlerbehandlung)

public static class IndirectReferenceMap {

public static int GetDirectReference(Guid indirectReference)
{
var map = (Dictionary<Guid, int>)HttpContext.Current.Session["IndirMap"];
return map[indirectReference];
}
public static Guid GetIndirectReference(int directReference)
{
var map = (Dictionary<int, Guid>)HttpContext.Current.Session["DirMap"];
return map == null ?
AddDirectReference(directReference)
 : map[directReference];
}
private static Guid AddDirectReference(int directReference)
{
var indirectReference = Guid.NewGuid();
HttpContext.Current.Session["DirMap"] = new Dictionary<int, Guid>
{ {directReference, indirectReference } };
HttpContext.Current.Session["IndirMap"] = new Dictionary<Guid, int>
{ {indirectReference, directReference } };
return indirectReference;
}

}


(B) Bei der Ausgabe die indirekte Referenz nutzen (Service-Aufruf mit AJAX)

service.GetCustomer('<%= IndirectReferenceMap.

GetIndirectReference(GetCustomerId()) %>', onSuccess, null, null);


(C) Bei der Verarbeitung mithilfe der indirekten Referenz auf das originale Objekt zugreifen

public Customer GetCustomer(Guid indirectId) {

var customerId = IndirectReferenceMap.GetDirectReference(indirectId);

...

Quelle: OWASP Top 10 for .NET developers part 4: Insecure direct object reference

Verteidigungs-Option 2 gegen 'Unsichere direkte Objektreferenzen':

tbd Text

Verteidigungs-Option 3 gegen 'Unsichere direkte Objektreferenzen':

tbd Text

Auswirkung(en) auf den Benutzer

(ganze Breite) Text

Referenzen

OWASP

Für weitere Anforderungen an Zugangskontrollen siehe

ASVS requirements area for Access Control (V4).

Andere

Verteidigungs-Option 1 gegen 'Unsichere direkte Objektreferenzen':

tbd Text

Verteidigungs-Option 2 gegen 'Unsichere direkte Objektreferenzen':

tbd Text

Verteidigungs-Option 3 gegen 'Unsichere direkte Objektreferenzen':

tbd Text

Auswirkung(en) auf den Benutzer

(ganze Breite) Text

Referenzen

← A3-Cross-Site Scripting (XSS)
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

A5-Sicherheitsrelevante Fehlkonfiguration →

© 2002-2013 OWASP Foundation This document is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. Some rights reserved. CC-by-sa-3 0-88x31.png