Format String in Feathersjs
How Format String Manifests in Feathersjs
Format string vulnerabilities in Feathersjs applications typically emerge through improper logging and error handling patterns. Feathersjs, being a real-time framework built on Express, inherits many of the same security considerations but with some unique characteristics due to its service-oriented architecture.
The most common manifestation occurs in custom service methods where developers use console.log or custom logging with user-controlled data. Consider a Feathersjs service that logs request parameters:
class MessageService {
async create(data, params) {
console.log(`Creating message: ${data.text}`);
return this.app.service('messages').create(data);
}
}
This appears safe but becomes dangerous when combined with Feathersjs's flexible parameter handling. A malicious request could include format specifiers in the text field:
{
"text": "Hello %s %n"
}
When logged with console.log, this could trigger format string vulnerabilities, especially in Node.js versions where console.log processes format specifiers.
Another Feathers-specific scenario involves service hooks that log authentication data. Hooks in Feathersjs are powerful middleware that can access raw request data:
const { authenticate } = require('@feathersjs/authentication').hooks;
module.exports = {
before: {
all: [authenticate('jwt')]
},
after: {
all: [
context => {
console.log(`User ${context.params.user.name} accessed ${context.method}`);
}
]
}
}
If user.name contains format specifiers, this logging becomes vulnerable. The real-time nature of Feathersjs through Socket.io can exacerbate this, as format strings might be processed in WebSocket message handlers:
app.service('messages').on('created', message => {
// Vulnerable if message.content contains format specifiers
console.log(`New message from ${message.userId}: ${message.content}`);
});
Feathersjs's flexible service adapters also create unique attack surfaces. When using MongoDB or other database adapters, error messages might include user data:
async find(params) {
try {
return await this.Model.find(params.query);
} catch (error) {
console.error(`Database error for query ${params.query}: ${error.message}`);
}
}
A carefully crafted query parameter could exploit format string vulnerabilities in error logging, especially when combined with Feathersjs's query sanitization that might not properly escape format specifiers.
Feathersjs-Specific Detection
Detecting format string vulnerabilities in Feathersjs requires understanding its unique architecture and common patterns. The middleBrick API security scanner includes specialized detection for Feathersjs applications, focusing on the framework's specific characteristics.
middleBrick's scanner identifies format string risks by analyzing both the OpenAPI specification and runtime behavior. For Feathersjs applications, it looks for patterns like:
middlebrick scan https://api.yourapp.com
The scanner examines service definitions, hooks, and event handlers for vulnerable logging patterns. It specifically flags Feathersjs's flexible parameter handling where user input might flow into logging functions.
Manual detection should focus on these Feathersjs-specific areas:
- Service hooks that log authentication or authorization data
- Event listeners for real-time events (created, updated, removed)
- Custom service methods that log request parameters
- Error handlers that include user data in log messages
middleBrick's LLM/AI security module also scans for format string patterns in AI-related endpoints, which is particularly relevant for Feathersjs applications using AI services:
const aiService = require('./ai-service');
async function processWithAI(data) {
const result = await aiService.analyze(data.text);
console.log(`AI analysis result: ${result}`); // Vulnerable if result contains format specifiers
return result;
}
The scanner's OpenAPI analysis resolves all $ref references, which is crucial for Feathersjs applications that often use complex service schemas and custom types.
For comprehensive coverage, middleBrick's continuous monitoring (Pro plan) can scan your Feathersjs API on a schedule, catching new format string vulnerabilities introduced during development:
# GitHub Action for CI/CD integration
- name: middleBrick Security Scan
uses: middlebrick/middlebrick-action@v1
with:
api_url: ${{ secrets.API_URL }}
fail_below: B
This ensures format string vulnerabilities are caught before deployment, especially important for Feathersjs applications where real-time features might introduce new attack surfaces.
Feathersjs-Specific Remediation
Remediating format string vulnerabilities in Feathersjs requires a framework-specific approach. The key is to eliminate string interpolation with user data and use safe logging practices throughout your Feathersjs application.
The most effective remediation is to use structured logging with placeholders instead of string interpolation. For Feathersjs applications, this means:
const logger = require('./logger');
class MessageService {
async create(data, params) {
// Safe: uses placeholder, not interpolation
logger.info('Creating message', { text: data.text });
return this.app.service('messages').create(data);
}
}
For Feathersjs hooks, apply the same principle:
const safeLogHook = context => {
const { method, type } = context;
const userId = context.params.user?.id;
// Safe: structured logging with separate data object
logger.info(`${type}.${method} called`, { userId });
return context;
};
Event handlers in Feathersjs require special attention due to their real-time nature:
app.service('messages').on('created', message => {
// Safe: structured logging
logger.info('New message created', {
messageId: message.id,
userId: message.userId,
contentPreview: message.content?.substring(0, 50)
});
});
For error handling, always sanitize user data before logging:
async find(params) {
try {
return await this.Model.find(params.query);
} catch (error) {
// Safe: don't include raw user data in error messages
logger.error('Database query failed', {
query: JSON.stringify(params.query),
error: error.message
});
}
}
middleBrick's CLI tool can help verify your remediation:
middlebrick scan --format=json https://api.yourapp.com > report.json
Look for the "Input Validation" and "Logging Security" sections in the report to confirm format string vulnerabilities are resolved.
For Feathersjs applications using authentication, ensure token and credential logging is completely eliminated:
const { authenticate } = require('@feathersjs/authentication').hooks;
module.exports = {
before: {
all: [
authenticate('jwt'),
context => {
// Safe: don't log tokens or sensitive data
logger.debug('Authentication successful', {
userId: context.params.user?.id,
method: context.method
});
}
]
}
}
Consider implementing a custom logging wrapper for your Feathersjs app that enforces safe practices:
class SafeLogger {
info(message, data) {
// Remove any format specifiers from data keys/values
const sanitizedData = this.sanitize(data);
console.log(`INFO: ${message}`, sanitizedData);
}
sanitize(obj) {
if (typeof obj !== 'object' || obj === null) return obj;
return Object.entries(obj).reduce((acc, [key, value]) => {
const safeKey = String(key).replace(/%[a-zA-Z]/g, '');
const safeValue = String(value).replace(/%[a-zA-Z]/g, '');
acc[safeKey] = safeValue;
return acc;
}, {});
}
}
This approach ensures that even if developers accidentally use interpolation, the data is sanitized before logging.