Unimplemented or Unsupported Feature in UI
Description
Unimplemented or Unsupported Feature in UI is a vulnerability where a UI function for a security feature appears to be supported and gives feedback to the user that suggests it is supported, but the underlying functionality is not implemented. Users interact with controls that seem to configure security settings, receive confirmation that changes were applied, yet the backend functionality does not exist or is non-functional. This creates a dangerous gap between perceived and actual security posture.
Risk
Unimplemented security features in UI create severe security gaps. Users and administrators configure what they believe are active security controls, but no actual protection exists. Organizations may pass compliance audits based on UI screenshots showing enabled features while being completely unprotected. Attackers can exploit this gap knowing that security controls visible in the UI are not actually enforced. The risk is particularly severe for features like access control lists, encryption, intrusion detection, and audit logging where the absence of actual implementation leaves systems fully exposed while appearing protected.
Solution
Perform comprehensive functionality testing before deploying applications to verify that all UI-exposed security features have working backend implementations. Implement end-to-end testing that validates security controls are actually enforced after being enabled through the UI. Remove or clearly disable UI elements for features that are not yet implemented. If features are planned but not ready, clearly label them as "Coming Soon" or similar. Ensure development processes require both UI and backend implementation before features are considered complete. Use automated testing to verify security feature functionality.
Common Consequences
| Impact | Details |
|---|---|
| Other | Scope: Other Varies by Context - Impact depends on the specific security feature that appears functional but is not implemented. |
| Other | Scope: Other Unexpected State - Systems operate in an unexpected security state because the user believes protections are active when they are not. |
Example Code
Vulnerable Code
// Vulnerable: Security features in UI with no backend implementation
class VulnerableSecurityPanel {
// Vulnerable: Checkbox exists but feature not implemented
enableFirewallRule(rule) {
console.log("Firewall rule configuration:", rule);
// Vulnerable: UI shows success but no actual firewall configuration
// Backend firewall API not connected or not implemented
// Shows green checkmark: "Firewall rule enabled"
return {
success: true,
message: `Rule "${rule.name}" has been enabled`
};
// Attacker bypasses "firewall" that doesn't exist
}
// Vulnerable: ACL configuration accepted but not applied
setAccessControlList(acl) {
// UI validates input format
if (!this.validateACLFormat(acl)) {
return { success: false, message: "Invalid ACL format" };
}
// Vulnerable: ACL stored in UI state only
this.displayedACL = acl;
// Vulnerable: Backend function is a stub
applyACL(acl); // function applyACL(acl) { return true; }
// Admin sees "ACL Applied" but no access restrictions exist
return {
success: true,
message: "Access control list has been applied"
};
}
}
// Vulnerable stub function
function applyACL(acl) {
// TODO: Implement ACL enforcement
return true;
}
# Vulnerable: Router configuration with unimplemented keywords
class VulnerableRouterConfig:
def __init__(self):
self.displayed_rules = []
def add_firewall_rule(self, rule):
# Vulnerable: Rule keyword "established" not implemented
# UI accepts rule but backend ignores the keyword
# Rule: "permit tcp any any established"
# "established" keyword should only allow established connections
# But implementation ignores it, allowing all TCP
if 'established' in rule:
# Vulnerable: Keyword parsed but not enforced
rule_parsed = self.parse_rule(rule)
# rule_parsed.established is set but never checked in packet filter
self.displayed_rules.append(rule)
# UI shows: "Rule added: permit tcp any any established"
# Actual behavior: permits ALL tcp, not just established
return "Rule successfully added"
def enable_intrusion_detection(self):
# Vulnerable: IDS feature shown in UI but not implemented
self.ids_enabled = True # UI state only
# Vulnerable: No actual IDS functionality
# start_intrusion_detection() doesn't exist or is empty
return {
'status': 'enabled',
'message': 'Intrusion Detection System is now active',
'signatures_loaded': 15000 # Fake number
}
// Vulnerable: Security configuration tool with stub implementations
public class VulnerableSecurityTool {
private Map<String, Boolean> displayedSettings = new HashMap<>();
// Vulnerable: Encryption toggle with no implementation
public ConfigResult enableEncryption(String algorithm) {
// UI shows algorithm options: AES-256, RSA-2048, etc.
// But no actual encryption is performed
displayedSettings.put("encryption", true);
displayedSettings.put("algorithm", true);
// Vulnerable: Backend encryption not implemented
// Data stored in plaintext despite UI showing "Encrypted"
return new ConfigResult(
true,
"Encryption enabled using " + algorithm,
EncryptionStatus.ACTIVE // Lie
);
}
// Vulnerable: Password policy appears enforced but isn't
public ConfigResult setPasswordPolicy(PasswordPolicy policy) {
// UI accepts complex password policy configuration
// minimum length, complexity, history, expiration
// Vulnerable: Policy saved to display but not enforced
this.displayedPolicy = policy;
// Registration/password change doesn't check policy
// Users can set "password123" despite UI showing strict requirements
return new ConfigResult(
true,
"Password policy has been updated",
PolicyStatus.ENFORCED // Lie
);
}
}
Fixed Code
// Fixed: Security features with verified implementation
class SecureSecurityPanel {
async enableFirewallRule(rule) {
try {
// Fixed: Check if firewall backend is available
const firewallStatus = await this.checkFirewallBackend();
if (!firewallStatus.available) {
return {
success: false,
message: "Firewall service is not available"
};
}
// Fixed: Actually configure the firewall
const result = await this.firewallAPI.addRule(rule);
if (!result.success) {
return {
success: false,
message: `Failed to add rule: ${result.error}`
};
}
// Fixed: Verify rule is active
const verification = await this.firewallAPI.verifyRule(rule.id);
if (!verification.active) {
// Fixed: Rollback and report failure
await this.firewallAPI.removeRule(rule.id);
return {
success: false,
message: "Rule could not be verified as active"
};
}
return {
success: true,
message: `Rule "${rule.name}" enabled and verified`,
ruleId: result.ruleId
};
} catch (error) {
return {
success: false,
message: `Firewall configuration error: ${error.message}`
};
}
}
async setAccessControlList(acl) {
if (!this.validateACLFormat(acl)) {
return { success: false, message: "Invalid ACL format" };
}
try {
// Fixed: Apply ACL through actual backend
const result = await this.aclBackend.apply(acl);
if (!result.success) {
return {
success: false,
message: `ACL application failed: ${result.error}`
};
}
// Fixed: Test that ACL is enforced
const testResult = await this.testACLEnforcement(acl);
if (!testResult.enforced) {
return {
success: false,
message: "ACL verification failed - rules not being enforced"
};
}
return {
success: true,
message: "Access control list applied and verified",
appliedRules: result.appliedCount
};
} catch (error) {
return {
success: false,
message: `ACL error: ${error.message}`
};
}
}
}
# Fixed: Router configuration with implemented keywords
class SecureRouterConfig:
def __init__(self):
self.active_rules = []
self.packet_filter = PacketFilter()
def add_firewall_rule(self, rule):
try:
rule_parsed = self.parse_rule(rule)
# Fixed: Verify all keywords are implemented
unsupported = self.check_unsupported_keywords(rule_parsed)
if unsupported:
return {
'success': False,
'message': f'Unsupported keywords: {", ".join(unsupported)}'
}
# Fixed: Actually implement the rule in packet filter
if rule_parsed.get('established'):
# Fixed: Implement connection tracking
self.packet_filter.add_stateful_rule(rule_parsed)
else:
self.packet_filter.add_stateless_rule(rule_parsed)
# Fixed: Verify rule is active
if not self.packet_filter.verify_rule(rule_parsed.id):
return {
'success': False,
'message': 'Rule could not be activated'
}
self.active_rules.append(rule_parsed)
return {
'success': True,
'message': f'Rule added and verified: {rule}',
'rule_id': rule_parsed.id
}
except NotImplementedError as e:
return {
'success': False,
'message': f'Feature not implemented: {e}'
}
def check_unsupported_keywords(self, rule):
"""Return list of keywords in rule that are not implemented."""
supported = {'permit', 'deny', 'tcp', 'udp', 'icmp', 'any',
'established', 'eq', 'gt', 'lt', 'range'}
rule_keywords = set(rule.keywords)
return list(rule_keywords - supported)
def enable_intrusion_detection(self):
# Fixed: Check if IDS is actually available
if not self.ids_engine.is_available():
return {
'success': False,
'message': 'IDS engine not installed or not licensed'
}
try:
# Fixed: Actually start IDS
self.ids_engine.start()
# Fixed: Verify IDS is running and detecting
test_result = self.ids_engine.self_test()
if not test_result.passed:
self.ids_engine.stop()
return {
'success': False,
'message': f'IDS self-test failed: {test_result.error}'
}
return {
'success': True,
'message': 'Intrusion Detection System active',
'signatures_loaded': self.ids_engine.signature_count,
'engine_version': self.ids_engine.version
}
except Exception as e:
return {
'success': False,
'message': f'Failed to start IDS: {e}'
}
// Fixed: Security tool with verified implementations
public class SecureSecurityTool {
private final EncryptionService encryptionService;
private final PolicyEnforcer policyEnforcer;
public SecureSecurityTool(EncryptionService encryption, PolicyEnforcer policy) {
this.encryptionService = Objects.requireNonNull(encryption);
this.policyEnforcer = Objects.requireNonNull(policy);
}
public ConfigResult enableEncryption(String algorithm) {
// Fixed: Verify encryption service is available
if (!encryptionService.isAvailable()) {
return new ConfigResult(
false,
"Encryption service not available",
EncryptionStatus.UNAVAILABLE
);
}
// Fixed: Verify algorithm is supported
if (!encryptionService.supportsAlgorithm(algorithm)) {
return new ConfigResult(
false,
"Algorithm not supported: " + algorithm,
EncryptionStatus.UNSUPPORTED
);
}
try {
// Fixed: Actually enable encryption
encryptionService.enable(algorithm);
// Fixed: Verify encryption is working
String testData = "verification_test";
byte[] encrypted = encryptionService.encrypt(testData.getBytes());
byte[] decrypted = encryptionService.decrypt(encrypted);
if (!testData.equals(new String(decrypted))) {
encryptionService.disable();
return new ConfigResult(
false,
"Encryption verification failed",
EncryptionStatus.VERIFICATION_FAILED
);
}
return new ConfigResult(
true,
"Encryption enabled and verified using " + algorithm,
EncryptionStatus.ACTIVE
);
} catch (Exception e) {
return new ConfigResult(
false,
"Encryption error: " + e.getMessage(),
EncryptionStatus.ERROR
);
}
}
public ConfigResult setPasswordPolicy(PasswordPolicy policy) {
try {
// Fixed: Apply policy to actual enforcement engine
policyEnforcer.setPolicy(policy);
// Fixed: Test that policy is enforced
String weakPassword = "123";
if (policyEnforcer.validatePassword(weakPassword)) {
return new ConfigResult(
false,
"Policy not being enforced correctly",
PolicyStatus.VERIFICATION_FAILED
);
}
return new ConfigResult(
true,
"Password policy updated and verified",
PolicyStatus.ENFORCED
);
} catch (Exception e) {
return new ConfigResult(
false,
"Policy error: " + e.getMessage(),
PolicyStatus.ERROR
);
}
}
}
CVE Examples
- CVE-2000-0127 - Configuration tool checkbox failed to enable security option despite appearing selected.
- CVE-2001-0863 - Router ACL keyword not implemented, allowing filter bypass while appearing configured.
- CVE-2001-0865 - Router ACL keyword implementation gap allowing security bypass.
- CVE-2004-0979 - Browser security settings not actually modified when user changed them through UI.
References
- MITRE Corporation. "CWE-447: Unimplemented or Unsupported Feature in UI." https://cwe.mitre.org/data/definitions/447.html
- OWASP Testing Guide. "Configuration and Deployment Management Testing."