ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。
[AllowAnonymous]
属性を使用して、[Authorize]
属性による認証をバイパスします。[Authorize]
属性をクラスまたはメソッドに追加することにより、アプリケーション アクションで認証を要求するようにできます。さらに、[AllowAnonymous]
属性を追加することで、アプリケーション クラスまたはメソッドの指定された認証要件をバイパスできます。両方を指定すると、[AllowAnonymous]
属性が優先され、[Authorize]
属性はバイパスされます。これにより、攻撃者が、機密データやアクションに対して無作為で匿名のアクセスを行う可能性があります。[AllowAnonymous]
属性が、メソッドに設定された [Authorize]
属性をオーバーライドしていることを示しています。[Authorize]
属性があるにもかかわらず、secretAction()
メソッドは認証を要求しません。例 2: 次の例は、スーパークラスのクラス レベルの
...
[AllowAnonymous]
public class Authorization_Test
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
属性が、サブクラスのメソッドに設定された [Authorize]
属性をオーバーライドしていることを示しています。継承されたクラス Inherit_AA
に [AllowAnonymous]
属性があるため、secretAction()
メソッドは、[Authorize]
属性を指定していても認証を要求しません。例 3: 以下は、
...
[AllowAnonymous]
public abstract class Inherit_AA
{
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
属性が、継承を使用して、メソッド レベルで [Authorize]
属性をオーバーライドしていることを示しています。継承されたクラス secretAction()
に [AllowAnonymous]
属性があるため、secretAction()
メソッドは、オーバーライドするメソッドで [Authorize]
属性を指定していても認証を要求しません。
...
public abstract class Inherit_AA
{
[AllowAnonymous]
public abstract IActionResult secretAction()
{
}
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public override IActionResult secretAction()
{
}
}
...
<apex:page controller="accessControl">
<apex:pageBlock >
<apex:pageBlockSection >
<apex:outputText value="Survey Name: "/>
<apex:inputText value="{!surveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:outputText value="New Name: "/>
<apex:inputText value="{!newSurveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:commandButton value="Update" action="{!updateName}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:page>
public String surveyName { get; set; }
public String newSurveyName { get; set; }
public PageReference updateName() {
Survey__c s = [SELECT Name FROM Survey__c WHERE Name=:surveyName];
s.Name = newSurveyName;
update s;
PageReference page = ApexPages.currentPage();
page.setRedirect(true);
return page;
}
String canned_acl = request.getParameter("acl");
CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
.bucket("foo")
.acl(canned_acl)
.createBucketConfiguration(CreateBucketConfiguration.builder().locationConstraint(region.id()).build())
.build();
acl
パラメーターが限定されたセットから選択されることを期待している場合でも、攻撃者はそれを public-read-write
に設定し、バケットへの完全な匿名アクセス権を付与することができます。
...
String selectedInvoice = request.getParameter("invoiceDate");
...
AmazonSimpleDBClient sdbc = new AmazonSimpleDBClient(appAWSCredentials);
GetAttributesResult sdbResult = sdbc.getAttributes(new GetAttributesRequest("invoices", selectedInvoice));
...
Example 1
のコードは、現在のユーザーに属する領収書のリストを生成しますが、攻撃者はこの動作を回避して希望する任意の領収書をリクエストすることができます。この例のコードの場合、リクエストされた領収書へのアクセス権限をユーザーが確保しているか確認しないため、現在のユーザーに帰属していなくても、リクエストされたとおりの領収書を表示します。
...
id = this.getIntent().getExtras().getInt("id");
cursor = db.query(Uri.parse(invoices), columns, "id = ? ", {id}, null, null, null);
...
id
に可能なすべての値を検討しきれていないことです。現在のユーザーに属する領収書 ID のリストがクエリにより生成されますが、攻撃者はこの動作を回避して希望する任意の領収書をリクエストすることができます。この例のコードの場合、リクエストされた領収書へのアクセス権限がユーザーにあるか確認しないため、現在のユーザー以外のものも含め、リクエスト通りに領収書を表示します。DirectoryEntry de
を作成します。
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou=People,dc=example,dc=com");
...
de
に対するすべての LDAP クエリは、Authentication および Access Control なしで実行されます。攻撃者は予期しない方法でこれらのクエリのいずれかを操作して、ディレクトリの Access Control メカニズムにより保護されている可能性があるレコードにアクセスする可能性があります。ldap_simple_bind_s()
を使用して、LDAP ディレクトリを匿名でバインドします。
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
ld
に対するすべての LDAP クエリは、Authentication および Access Control なしで実行されます。攻撃者は予期しない方法でこれらのクエリのいずれかを操作して、ディレクトリの Access Control メカニズムにより保護されている可能性があるレコードにアクセスする可能性があります。DirContext ctx
を作成します。
...
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
...
ctx
に対するすべての LDAP クエリは、Authentication および Access Control なしで実行されます。攻撃者は予期しない方法でこれらのクエリのいずれかを操作して、ディレクトリの Access Control メカニズムにより保護されている可能性があるレコードにアクセスする可能性があります。
...
$ldapbind = ldap_bind ($ldap, $dn, $password = "" );
...
...
PARAMETERS: p_xfeld TYPE xfeld.
...
CALL FUNCTION 'BAPI_EMPLOYEE_GETDATA'
EXPORTING
employee_id = emp_id
authority_check = p_xfeld
IMPORTING
return = ret
TABLES
org_assignment = org_data
personal_data = pers_data
internal_control = con_data
communication = comm_data
archivelink = arlink.
...
p_xfeld
に空白を指定した場合、従業員の個人情報や連絡先情報を返す前に、認証チェックは実行されません。