ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。
AUTHID
句が定義されていないパッケージは、AUTHID DEFINER
に戻ります。AUTHID DEFINER
または AUTHID CURRENT_USER
のいずれかです。定義者権限が付与されているパッケージ内の関数およびプロシージャーは、そのパッケージを定義するユーザの権限で実行されます。これにより、テーブルまたはスキーマ全体にアクセス権限を付与せずに、データの特定の部分を更新する、あるいはアクセスすることができます。実行者権限、つまり AUTHID CURRENT_USER
が設定されているパッケージにおいて、関数およびプロシージャーはその関数またはプロシージャーを呼び出すユーザーの権限で実行されます。これは、データに対するアクセス権限がない場合は、ユーザーにはアクセス権限が付与されません。AUTHID
句が定義されていない場合、そのパッケージは定義者権限に戻ります。 SYS
または高い権限を持つ別のユーザーによって定義されるため、そのコードが悪用された場合の危険性が高まります。<uses-permission/>
タグを介して、AndroidManifest.xml
ファイルに権限を表示して、アプリケーションのインストール時に権限を要求する必要があります。必要な権限が要求されない場合、これらの権限を要求する操作は実行時に失敗します。java.lang.SecurityException
がアプリケーションに例外として戻される場合がありますが、例外なしで、操作がそのまま失敗する場合もあります。sms.sendTextMessage(recipient, null, message, PendingIntent.getBroadcast(SmsMessaging.this, 0, new Intent(ACTION_SMS_SENT), 0), null);
android.permission.SEND_SMS
権限を必要とします。この権限が、マニフェストファイルでアプリケーションによって要求されていない場合は、アプリケーションは、SMS の送信に失敗します。<uses-permission/>
タグを介して、AndroidManifest.xml
ファイルに権限を表示して、アプリケーションのインストール時に権限を要求する必要があります。必要な権限が要求されない場合、これらの権限を要求する操作は実行時に失敗します。java.lang.SecurityException
がアプリケーションに例外として戻される場合がありますが、例外なしで、操作がそのまま失敗する場合もあります。Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
android.permission.READ_CONTACTS
権限が必要です。この権限が、マニフェストファイルでアプリケーションによって要求されていない場合は、アプリケーションは、連絡先情報を読み取れません。<uses-permission/>
タグを介して、AndroidManifest.xml
ファイルに権限を表示して、アプリケーションのインストール時に権限を要求する必要があります。必要な権限が要求されない場合、これらの権限を要求する操作は実行時に失敗します。java.lang.SecurityException
がアプリケーションに例外として戻される場合がありますが、例外なしで、操作がそのまま失敗する場合もあります。android.provider.Telephony.SMS_RECEIVED
アクションを使用してインテントを送信します。
Intent i = new Intent("android.provider.Telephony.SMS_RECEIVED");
context.sendBroadcast(i);
android.permission.BROADCAST_SMS
権限が必要です。この権限が、マニフェストファイルでアプリケーションによって要求されていない場合は、アプリケーションは、インテントを送信できません。public
メソッドの権限付きのコードは、JVM のどこからでもコールできます。public
アクセス指定子が付いていると、外部コードがこのメソッドをコールできることになります。権限付きのアクションを実行する public メソッドは、コードがライブラリや環境で共有されると、システムに動的に入り込むことがあり、Code Injection、Dangerous File Inclusion、File Upload などの攻撃を受ける危険性が高くなる場合があります。doPrivilegedOpenFile()
が public
として宣言され、昇格した操作を実行しています。
public static void doPrivilegedOpenFile(final String filePath) {
final BadFileNamePrivilegedAction pa = new BadFileNamePrivilegedAction(filePath);
FileInputStream fis = null;
...
fis = (FileInputStream)AccessController.doPrivileged(pa);
...
}
ALL PRIVILEGES
または ALL
オプションを使用すると、オブジェクトに適用可能なすべての権限がユーザーに付与されます。付与される権限のすべてをプログラマが認識していないことがあります。
GRANT ALL ON employees TO john_doe;
john_doe
にはテーブル定義を変更できる権限が付与されました。true
を指定して手動でコールバックを呼び出し、権限が付与されたと指定しています。
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions$Callback callback){
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
ACTUATOR
ロールを持つユーザーのみにアクセスを許可することで保護されています。
management.security.enabled=false
endpoints.health.sensitive=false
@Component
public class CustomEndpoint implements Endpoint<List<String>> {
public String getId() {
return "customEndpoint";
}
public boolean isEnabled() {
return true;
}
public boolean isSensitive() {
return false;
}
public List<String> invoke() {
// Custom logic to build the output
...
}
}
spring.application.admin.enabled
プロパティを指定してアプリケーションの管理関連機能を有効にすることを許可します。これにより、プラットフォーム MBeanServer
で SpringApplicationAdminMXBean
が公開されます。開発者は、この機能を使用して Spring Boot アプリケーションをリモート管理できますが、この機能はリモート JMX エンドポイントという形式で、攻撃可能な領域を増やします。MBeanServer
の設定によっては、MBean
をローカルまたはリモートで公開でき、認証が必須かどうかも変わります。最悪の場合、攻撃者は、認証なしでアプリケーションをシャットダウンするなど、アプリケーションをリモートから管理できます。最良の場合、サービスは、サーバーの保護に使用される資格情報と同じくらい強力になります。spring-boot-devtools
を有効にすると、セキュリティ リスクが生じます。実運用環境では有効にしないでください」
endpoints.shutdown.enabled=true
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="permitAll" />
</http>
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
<http auto-config="true">
...
<headers disabled="true"/>
...
</http>
Ant
パス式を流用しました。/admin
」Ant
パス式に一致するエンドポイントではいずれも管理者アクセス権限を必要とします。
<http auto-config="true">
...
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
...
<intercept-url pattern="/**" access="permitAll" />
</http>
Accept
ヘッダーを使用するか、拡張機能を使用して目的のコンテンツタイプを指定するか、いずれかを指定できます。たとえば、/admin
リソースは、リクエストを/admin.json
へ送信することによって、JSON ドキュメントとしてリクエストできます。Ant
パス式ではコンテンツネゴシエーション拡張機能を考慮しないため、リクエストは /admin
式に一致せず、エンドポイントは保護されません。anyRequest()
。anyRequest()
マッチャーを使用するフォールバック チェックの定義に失敗すると、エンドポイントが保護されないままになります。
<http auto-config="true">
<intercept-url pattern="/app/admin" access="ROLE_ADMIN" />
<intercept-url pattern="/" access="permitAll" />
</http>
Example 1
だと、現在や将来のエンドポイント (/admin/panel
など) が保護されないままになる可能性があります。HttpFirewall
を FilterChainProxy
に追加して、要求がフィルタ チェーン経由で送信される前に処理することで、この機能を実現します。Sprint Security はデフォルトで StrictHttpFirewall
実装を使用します。%2F
と ;
文字を許容するようファイアウォール ポリシーを緩和します。
<beans:bean id="httpFirewall" class="org.springframework.security.web.firewall.StrictHttpFirewall" p:allowSemicolon="true" p:allowUrlEncodedSlash="true"/>
NoneAuth
認証方法を使用して、使用可能な認証方法を判断することができます。
client = SSHClient()
client.connect(host, port, auth_strategy=NoneAuth("user"))
remove
コマンドを使用して、外部の攻撃者はデータセット全体を削除することができます。最近、インターネット上で実行しているオープンな MongoDB の安全ではないインスタンスに対する悪意のある攻撃が報告されています。攻撃者はデータベースを消去し、復元のために身代金を支払うよう要求しました。remove
コマンドを使用して、外部の攻撃者はデータセット全体を削除することができます。 最近、インターネット上で実行しているオープンな MongoDB の安全ではないインスタンスに対する悪意のある攻撃が報告されています。 攻撃者はデータベースを消去し、復元のために身代金を支払うよう要求しました。