このセクションには、ソース コード以外のものでも、作成中の製品のセキュリティにとって重要なものがすべて含まれています。この分野が対象とする問題は、ソース コードに直接関係しないため、この分野の他の部分と分けました。
https_redirect
を false
に設定することで、クライアントが通信で HTTP を使用することを許可する URL マップを定義する Terraform 構成を示しています。
resource "google_compute_url_map" "urlmap" {
...
default_url_redirect {
...
https_redirect = false
...
}
...
}
rsasha1
を使用して DNSSEC を有効にする Terraform 構成を示しています。
resource "google_dns_managed_zone" "zone-demo" {
...
dnssec_config {
default_key_specs {
algorithm = "rsasha1"
...
}
}
...
}
networking_mode
を ROUTES
に設定しているため、VPC ネイティブのクラスターが有効になっていません。
resource "google_container_cluster" "cluster_demo" {
...
networking_mode = "ROUTES"
..
}
X-XSS-Protection
を 1; mode=block
に設定すると、以前のバージョンのブラウザーでは Cross-site Scripting の脆弱性が生じます。X-XSS-Protection
は、他のブラウザーで採用されたために Microsoft が導入した HTTP ヘッダーです。これは、Cross-Site Scripting
攻撃が成功しないようにするものですが、図らずも安全な Web サイトを脆弱にしてしまうことになりました [1]。このため、この HTTP ヘッダーは以前のバージョンの Internet Explorer では使用しないでください。また、ヘッダーを 0
に設定して無効化する必要があります。Express
アプリケーションで Helmet
ミドルウェアを不適切に設定してすべてのバージョンの Internet Explorer でこれを有効にします。
var express = require('express');
var app = express();
var helmet = require('helmet');
...
app.use(helmet.xssFilter({ setOnOldIE: true}));
...
Application_BeginRequest
が空であるか、X-Content-Type-Options
を nosniff
に設定する関数コールを含んでいないか、そのヘッダーを削除しようとしています。X-Content-Type-Options: nosniff
を使用する必要があります。X-Content-Type-Options
を nosniff
に設定しないでおきます。X-Content-Type-Options: nosniff
を各ページで使用して、ユーザーが制御できるコンテンツが含まれるようにしてください。net.http.DetectContentType()
を使用してレスポンス Content-Type を判断します。
...
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
content_type := DetectContentType(body)
...
X-Content-Type-Options
が nosniff
に設定されないか、このセキュリティ ヘッダーが明示的に無効化されます。X-Content-Type-Options: nosniff
を使用する必要があります。
<http auto-config="true">
...
<headers>
...
<content-type-options disabled="true"/>
</headers>
</http>
X-Content-Type-Options
が nosniff
に設定されないか、このセキュリティ ヘッダーは明示的に無効になります。X-Content-Type-Options: nosniff
を使用する必要があります。X-Content-Type-Options
が nosniff
に設定されないか、このセキュリティ ヘッダーは明示的に無効になります。X-Content-Type-Options: nosniff
を使用する必要があります。memset()
を使用してパスワードをメモリから消し去ろうと試みています。
void GetData(char *MFAddr) {
char pwd[64];
if (GetPasswordFromUser(pwd, sizeof(pwd))) {
if (ConnectToMainframe(MFAddr, pwd)) {
// Interaction with mainframe
}
}
memset(pwd, 0, sizeof(pwd));
}
pwd
が値の上書き後に使用されないため、memset()
のコールは無駄な格納域として削除されます [2]。バッファ pwd
には機密性の高い値が含まれるため、データがメモリに常駐したままになるとアプリケーションが攻撃に対して脆弱になる場合があります。攻撃者がメモリの適切な領域にアクセスできる場合、パスワードを回復してシステムを制御できる可能性があります。memset()
のコールを Dead Code と解釈しています。ここでの問題は、多くのコンパイラやプログラム言語では、効率の向上を目指すあまり、個別的なセキュリティ上の懸念材料が考慮に入れられていない点にあります。
char *buf;
int len;
...
len = 1<<30;
if (buf+len < buf) //wrap check
[handle overflow]
buf + len
という操作は 2^32
よりも大きいため、結果の値は buf
よりも小さくなります。しかし、ポインタ上の算術オーバーフローは未定義の動作であるため、一部のコンパイラでは buf + len >= buf
だと判断され、ラップ チェックが最適化で削除されます。そのような最適化が実行された結果、このブロックの後に続くコードが Buffer Overflow に対して脆弱にある可能性があります。static files
アプリケーションの serve
ビューを開示します。Django のマニュアルには次のように記載されています。static files
ツールは、大部分において、実運用に静的ファイルを配置する作業を支援する目的で設計されています。これは多くの場合、ローカルで展開するときに大変な経費となる別個の専用静的ファイル サーバーを意味します。そのため、静的ファイル アプリに簡易ヘルパー ビューが付属します。これを利用し、開発にローカルにファイルを提供できます。DEBUG
が True
の場合にのみ機能します。admin
アプリケーションが予測可能な URL に配置されます。
from django.conf.urls import patterns
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
...
url(r'^admin/', include(admin.site.urls)),
...
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="SRN"
userClassNames="com.srn.security.UserPrincipal"
roleClassNames="com.srn.security.RolePrincipal"/>
Realm
タグでは、ログレベルを示す debug
と呼ばれる属性をオプションで使用できます。数字が大きいほど、ログメッセージが詳細になります。デバッグレベルに非常に高い数字が設定されると、Tomcat ではログファイルにすべてのユーザー名とパスワードが平文で書き込まれます。Tomcat の JAASRealm
に関連するデバッグメッセージの境界は 3 (3 以上は不適切、2 以下は適切) ですが、Tomcat で提供される他の種類のレルムでは、この境界が異なることがあります。http://host/page.jsp%00
や http://host/page.js%2570
などの特別に細工されたリクエストを介して、ソース コードの詳細情報の漏洩に利用されてきました。さらに悪いことに、ユーザーによる任意のファイルのアップロードをアプリケーションが許可していると、攻撃者はこのメカニズムを使用して悪意のあるコードを JSP の形式でアップロードし、アップロードされたページに、悪意のあるコードをサーバー上で実行するように要求する可能性があります。
<security-constraint>
<web-resource-collection>
<web-resource-name>JSP Access for Everyone!</web-resource-name>
<description>Allow any user/role access to JSP</description>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
web.xml
ファイルのエントリは、2 つの admin
ロールを定義します。
<security-constraint>
<web-resource-collection>
<web-resource-name>AdminPage</web-resource-name>
<description>Admin only pages</description>
<url-pattern>/auth/noaccess/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Administrators only</description>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
...
<security-role>
<description>Administrator</description>
<role-name>admin</role-name>
</security-role>
<security-role>
<description>Non-Administrator</description>
<role-name>admin</role-name>
</security-role>
/servletA/*
が使用されます。
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/servletA/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletB</servlet-name>
<url-pattern>/servletA/*</url-pattern>
</servlet-mapping>