SV.EMAIL
未チェックの電子メール
このエラーは、電子メールアドレスまたは電子メールの他の部分に未チェックのユーザー入力が使用される場合に検出されます。
リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。
脆弱性とリスク
電子メールアドレスは、Web アプリケーションのきわめて一般的な入力フィールドです。場合によっては、アプリケーションがこれらの電子メールアドレスを使用して、ユーザーへの電子メール送信や、Web サイトでの電子メールアドレスの表示を行います。他のすべてのユーザー入力と同様に、電子メールアドレスは、悪意のある内容を使用した攻撃に対して脆弱です。たとえば、sendmail コマンドを直接呼び出すことにより、アプリケーションは、ユーザー用に保存された e-mail 文字列を使用してユーザーに電子メールを送信します。この文字列は、未チェックで使用する場合、sendmail とともにアプリケーションホスト上で実行する任意のコマンドを含んでいる可能性があります (したがって、コマンド インジェクションの脆弱性の原因となります)。また、悪意のあるユーザーが Web サーバーを使用して、スパム メールや不正な内容の電子メールを送信する可能性もあります。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
ユーザー入力からの電子メールインジェクション攻撃は、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証することで防止できます。検証には、長さと内容を含める必要があります。通常、英数字文字 (A ~ Z、a ~ z、0 ~ 9) のみが必要とされますが、電子メール アドレスでは '@' および場合によっては下線も使用可能です。受け取ったその他の文字はすべてエスケープする必要があります。受け取ったその他の文字はすべてエスケープする必要があります。たとえば、各パラメーターを HTTP 要求から読み取った場合などに実行します。
脆弱コード例 1
import javax.servlet.http.*;
import javax.mail.internet.*;
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try {
// Get system properties
Properties props = System.getProperties();
// Setup mail server
props.put("mail.smtp.host", "my.company.com");
// Get session
Session session = Session.getDefaultInstance(props, null);
// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("admin@my.company.com"));
final String email = req.getParameter("email");
Address addr = new InternetAddress(email);
message.setRecipient(Message.RecipientType.TO, addr);
message.setSubject(subject);
message.setText(text);
// Send message
Transport.send(message);
} catch (AddressException e) {
throw new ServletException(e);
} catch (MessagingException e) {
throw new ServletException(e);
}
}
Klocwork は、16 行目で SV.EMAIL の欠陥を報告し、次を示します。未検証のユーザー入力が 'email' に保存され (14 行目)、これを使用してアドレスオブジェクト 'addr' が作成された後 (15 行目)、16 行目でそれが受信者のアドレスとして使用されます。
脆弱コード例 2
import jakarta.servlet.http.*;
import jakarta.mail.internet.*;
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try {
// Get system properties
Properties props = System.getProperties();
// Setup mail server
props.put("mail.smtp.host", "my.company.com");
// Get session
Session session = Session.getDefaultInstance(props, null);
// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("admin@my.company.com"));
final String email = req.getParameter("email");
Address addr = new InternetAddress(email);
message.setRecipient(Message.RecipientType.TO, addr);
message.setSubject(subject);
message.setText(text);
// Send message
Transport.send(message);
} catch (AddressException e) {
throw new ServletException(e);
} catch (MessagingException e) {
throw new ServletException(e);
}
}
Klocwork は、16 行目で SV.EMAIL の欠陥を報告し、次を示します。未検証のユーザー入力が 'email' に保存され (14 行目)、これを使用してアドレスオブジェクト 'addr' が作成された後 (15 行目)、16 行目でそれが受信者のアドレスとして使用されます。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。