Using clear-text protocols exposes data in transit to eavesdropping and man-in-the-middle attacks.
An attacker who can observe network traffic — for example through a compromised network device, a position on the same network segment, or a cloud
environment breach — can read, modify, or inject data sent over ftp, telnet, http, or unencrypted SMTP without
detection. This is true even on internal or isolated networks, where insider threats or lateral movement after an initial compromise can expose
unencrypted traffic. This rule raises an issue when a clear-text protocol scheme is used or when encryption is explicitly disabled for a network
connection.
An attacker who can intercept network traffic can read all data transmitted over clear-text connections, including credentials, session tokens, API keys, or personal data.
Because clear-text protocols provide no integrity protection, an attacker in a man-in-the-middle position can silently modify data in transit — redirecting users to malicious endpoints, injecting malicious content into responses, or altering commands sent to remote services.
The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to interception.
url = "http://example.com" # Noncompliant
url = "ftp://anonymous@example.com" # Noncompliant
url = "telnet://anonymous@example.com" # Noncompliant
import telnetlib
cnx = telnetlib.Telnet("telnet.example.com") # Noncompliant
import ftplib
cnx = ftplib.FTP("ftp.example.com") # Noncompliant
import smtplib
smtp = smtplib.SMTP("smtp.example.com", port=587) # Noncompliant
url = "https://example.com"
url = "sftp://anonymous@example.com"
url = "ssh://anonymous@example.com"
import ftplib
cnx = ftplib.FTP_TLS("ftp.example.com")
import smtplib
smtp = smtplib.SMTP("smtp.example.com", port=587)
smtp.starttls(context=context)
smtp_ssl = smtplib.SMTP_SSL("smtp.example.com", port=465)
The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to interception.
For aws_cdk.aws_elasticloadbalancingv2.ApplicationLoadBalancer:
from aws_cdk import (
aws_elasticloadbalancingv2 as elbv2,
)
lb = elbv2.ApplicationLoadBalancer(
self,
"LB",
vpc=vpc,
internet_facing=True
)
lb.add_listener(
"Listener-default",
port=80, # Noncompliant
open=True
)
lb.add_listener(
"Listener-http-explicit",
protocol=elbv2.ApplicationProtocol.HTTP, # Noncompliant
port=8080,
open=True
)
from aws_cdk import (
aws_elasticloadbalancingv2 as elbv2,
)
lb = elbv2.ApplicationLoadBalancer(
self,
"LB",
vpc=vpc,
internet_facing=True
)
lb.add_listener(
"Listener-https-explicit",
protocol=elbv2.ApplicationProtocol.HTTPS,
certificates=[elbv2.ListenerCertificate("certificateARN")],
port=443,
open=True
)
lb.add_listener(
"Listener-https-implicit",
certificates=[elbv2.ListenerCertificate("certificateARN")],
port=8443,
open=True
)
The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to interception.
For aws_cdk.aws_elasticache.CfnReplicationGroup:
from aws_cdk import (
aws_elasticache as elasticache
)
elasticache.CfnReplicationGroup(
self,
"example-explicit",
replication_group_description="a replication group",
automatic_failover_enabled=False,
transit_encryption_enabled=False, # Noncompliant
cache_subnet_group_name="test",
engine="redis",
engine_version="3.2.6",
num_cache_clusters=1,
cache_node_type="cache.t2.micro"
)
elasticache.CfnReplicationGroup( # Noncompliant: encryption is disabled by default
self,
"example-implicit",
replication_group_description="a replication group",
automatic_failover_enabled=False,
cache_subnet_group_name="test",
engine="redis",
engine_version="3.2.6",
num_cache_clusters=1,
cache_node_type="cache.t2.micro"
)
from aws_cdk import (
aws_elasticache as elasticache
)
elasticache.CfnReplicationGroup(
self,
"example-explicit",
replication_group_description="a test replication group",
automatic_failover_enabled=False,
transit_encryption_enabled=True,
cache_subnet_group_name="test",
engine="redis",
engine_version="3.2.6",
num_cache_clusters=1,
cache_node_type="cache.t2.micro"
)
The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to interception.
For aws_cdk.aws_kinesis.CfnStream:
from aws_cdk import (
aws_kinesis as kinesis,
)
kinesis.CfnStream( # Noncompliant: encryption is disabled by default for CfnStreams
self,
"example-cfnstream-implicit",
shard_count=1
)
kinesis.CfnStream(self,
"example-cfnstream-explicit",
shard_count=1,
stream_encryption=None # Noncompliant
)
For aws_cdk.aws_kinesis.Stream:
from aws_cdk import (
aws_kinesis as kinesis,
)
stream = kinesis.Stream(self,
"example-stream",
shard_count=1,
encryption=kinesis.StreamEncryption.UNENCRYPTED # Noncompliant
)
from aws_cdk import (
aws_kinesis as kinesis,
)
kinesis.CfnStream(
self,
"example-cfnstream-explicit",
shard_count=1,
stream_encryption=kinesis.CfnStream.StreamEncryptionProperty(
encryption_type="KMS",
key_id="alias/aws/kinesis"
)
)
from aws_cdk import (
aws_kinesis as kinesis,
aws_kms as kms
)
stream = kinesis.Stream( # Encryption is enabled by default for Streams
self,
"example-stream",
shard_count=1
)
stream = kinesis.Stream(
self,
"example-stream-managed",
shard_count=1,
encryption=kinesis.StreamEncryption.MANAGED
)
No issue is reported for the following cases:
www.w3.org,
schemas.android.com, schema.org).example.com, example.net, example.org (RFC 6761). These
are almost always placeholders in source code, not real connection targets.