Use of Obsolete Function
Use of Obsolete Function occurs when code uses deprecated or obsolete functions that have known security vulnerabilities, performance issues, or design flaws. Developers continue using old APIs even though better, safer alternatives exist. The presence of obsolete functions signals that code hasn't been actively reviewed or maintained, often indicating deeper security and stability problems lurking nearby.
Programming languages and libraries deprecate functions when they become insecure, inefficient, or outdated. Using them anyway is a red flag for poor code quality and potential vulnerabilities.
Real-World Attack Scenarios
Scenario 1: Buffer Overflow via Gets()
The gets() function reads a line from input without checking buffer bounds:
#include <stdio.h>
int main() {
char password[20];
printf("Enter password: ");
gets(password); // OBSOLETE - No bounds checking!
if (strcmp(password, "secret123") == 0) {
printf("Access granted\n");
}
return 0;
}The vulnerability:
gets() reads input until a newline, with NO size limit. If input exceeds 20 bytes, it overwrites memory beyond the buffer.
The attack:
An attacker inputs 50 bytes of data:
The overflow overwrites:
Local variables
Return address
Saved frame pointer
Function pointers
Result:
Application crashes
Arbitrary code execution (if ROP gadgets available)
Complete system compromise
The fix: Use fgets() with explicit size limit:
Finding it: Search code for gets(). Test with inputs exceeding buffer size. Check for buffer overflows. Try fuzzing with long inputs.
Exploit:
Scenario 2: Password Verification Using getpw()
The deprecated getpw() function looks up user passwords with a buffer overflow vulnerability:
The vulnerability:
The getpw() function has multiple problems:
No bounds checking on the
pwdlinebufferIf the password file entry is longer than buffer, it overflows
The function is deprecated since the 1990s
Has been removed from modern systems
The attack:
An attacker creates a user account with an extremely long home directory or shell path in /etc/passwd. When getpw() reads this entry, it overflows the buffer.
Result:
Buffer overflow
Potential code execution with the privileges of the process running password verification
Authentication bypass
The fix: Use getpwuid() which is safe:
Finding it: Search for getpw(. Check password verification functions. Look for manual password file parsing.
Scenario 3: Weak Cryptography via DES
Developers use obsolete crypt() function with DES encryption (deprecated since 1970s):
The vulnerability:
DES is obsolete and broken:
Only 56-bit key (brute-forceable with modern hardware in seconds)
Can be cracked in < 1 day with GPUs
No salt randomization (salt only 2 characters = 4,096 possibilities)
Deterministic hashing (same password always produces same hash)
The attack:
An attacker:
Obtains password hashes from the system
Runs dictionary attack against DES hashes
Cracks passwords in hours (not years like with bcrypt)
Gains access to user accounts
Result:
All user passwords compromised
Complete system access
No protection against rainbow tables
The fix: Use modern hashing like bcrypt or Argon2:
Finding it: Search for crypt(). Look for DES usage. Check password hashing functions. Test if hashes are weak.
Scenario 4: Insecure Random Number Generation
Code uses obsolete rand() function for generating security tokens:
The vulnerability:
rand() is not cryptographically secure:
Uses a predictable PRNG
Seed value often predictable (time-based)
Insufficient entropy for security
Linear congruential generator is broken
The attack:
An attacker:
Discovers the seed (usually current time)
Predicts all future
rand()valuesForges CSRF tokens
Impersonates users
Result:
CSRF tokens can be forged
Account takeover
Unauthorized actions performed on behalf of users
The fix: Use cryptographically secure random:
Finding it: Search for rand(). Look for cryptographic operations using weak randomness. Check token generation.
Scenario 5: Character Encoding Issues with String Constructor
Java code uses obsolete String constructor that doesn't specify charset:
The vulnerability:
Without explicit charset:
Behavior depends on system default charset
May differ between Windows, Linux, macOS
May change between Java versions
Can cause encoding attacks
Example attack:
Attacker sends bytes that:
Decode differently depending on charset
Bypass validation on one charset but pass on another
Result in different data after charset conversion
Result:
Validation bypass
XSS due to encoding confusion
Data corruption
Finding it: Search for new String(byte[]). Look for character encoding operations. Test with non-ASCII characters.
Scenario 6: Deprecated OpenSSL Functions
Code uses deprecated OpenSSL functions for encryption:
The vulnerability:
Multiple issues:
DES is cryptographically broken
ECB mode reveals patterns in plaintext
Function deprecated in OpenSSL 1.1.0, removed in 3.0.0
Code won't compile on modern systems
The attack:
An attacker:
Captures encrypted data
Identifies patterns (ECB reveals repeated blocks)
Launches known-plaintext attacks
Decrypts sensitive information
Result:
Encryption provides no actual security
Data easily decrypted
System incompatible with modern OpenSSL
Finding it: Search for deprecated OpenSSL functions. Check OpenSSL version. Look for DES, MD5, RC4, SHA-1.
Exploit:
Scenario 7: Deprecated PHP Functions
PHP code uses obsolete mysql_* functions (removed in PHP 7.0):
The vulnerability:
Multiple critical issues:
mysql_*functions removed entirelyNo prepared statements (SQL injection vulnerable)
Functions deprecated in 2001, removed 2016
Code hasn't been maintained in years
The attack:
SQL injection through id parameter:
Query becomes:
Returns all users instead of one.
Result:
SQL injection vulnerability
Database compromise
All user data exposed
Code incompatible with PHP 7+
Finding it: Search for mysql_connect, mysql_query, mysql_fetch. Look for string concatenation in SQL queries. Check PHP version.
Exploit:
Mitigation Strategies
Replace all deprecated functions immediately
Replace gets() → fgets()
Replace strcpy() → strncpy() or strlcpy()
Replace crypt() → bcrypt or Argon2
Replace rand() → secure random
Replace mysql_* → mysqli or PDO
Regular code audits
Schedule quarterly code reviews
Focus on deprecated function usage
Create refactoring roadmap
Track and remove technical debt
Update dependencies regularly
Keep language updated to latest stable version
Update libraries regularly
Remove deprecated library versions
Monitor security advisories
Enable compiler warnings
Automated scanning Use tools to detect deprecated usage:
SonarQube
Checkmarx
FindBugs
Clang-Tidy
ESLint
Documentation
Document why replacements needed
Track deprecation lifecycle
Maintain migration guides
Archive obsolete code safely
Last updated