Generation of Error Message Containing Sensitive Information
The product generates an error message that includes sensitive information about its environment, users, or associated data.
The sensitive information may be valuable information on its own, or it may be useful for launching other, more serious attacks. The error message may be created in different ways, and the information that is included can range widely.
이 취약점을 수정하는 방법
5개의 Shoulder 탐지 규칙을 기반으로 한 Error Message Information Leak 예방 전략.
Return generic error messages to clients; log detailed errors server-side
func handler(w http.ResponseWriter, r *http.Request) { rows, err := db.Query("SELECT * FROM users") if err != nil { - http.Error(w, err.Error(), 500) + log.Printf("database query failed: %v", err) + http.Error(w, "Internal server error", 500) return } }
Return generic error messages to users and log detailed errors server-side
} catch (error) { - res.status(500).json({ error: error.message, stack: error.stack }); + logger.error('Operation failed', { error: error.message }); + res.status(500).json({ error: 'An error occurred' }); }
Configure errorFormatter to strip stack traces in production and use TRPCError with generic messages
- import { initTRPC } from '@trpc/server'; - import { router, publicProcedure } from './trpc'; - - export const t = initTRPC.context<Context>().create({ - // No errorFormatter configured - }); - - export const userRouter = router({ - createUser: publicProcedure - .mutation(async ({ input }) => { - try { - return await db.user.create({ data: input }); - } catch (err) { - throw err; // Raw database error exposed to client + import { initTRPC, TRPCError } from '@trpc/server'; + + export const t = initTRPC.context<Context>().create({ + errorFormatter({ shape }) { + return { + ...shape, + data: { + ...shape.data, + stack: process.env.NODE_ENV === 'production' + ? undefined + : shape.data.stack, + }, + }; + }, + }); + + export const userRouter = router({ + createUser: publicProcedure + .mutation(async ({ input }) => { + try { + return await db.user.create({ data: input }); + } catch (err) { + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: 'Failed to create user', + }); } }) });
Log full exception details internally but return generic error messages to users
- from flask import jsonify - - @app.route('/api/process') - def process(): - try: - result = expensive_operation() - return jsonify(result) - except Exception as e: - return jsonify({'error': str(e)}), 500 + import logging + from flask import jsonify + + logger = logging.getLogger(__name__) + + @app.route('/api/process') + def process(): + try: + result = expensive_operation() + return jsonify(result) + except Exception as e: + logger.error(f"Processing failed: {e}", exc_info=True) + return jsonify({'error': 'Internal server error'}), 500
Return generic responses; log internal paths server-side only
- from flask import jsonify - - @app.route('/info') - def get_info(): - return jsonify({ - 'status': 'ok', - 'path': __file__, - 'cwd': os.getcwd() - }) + import logging + from flask import jsonify + + logger = logging.getLogger(__name__) + + @app.route('/info') + def get_info(): + logger.info(f"Info request from {__file__}") + return jsonify({'status': 'ok', 'version': '1.0'})
코드에서 취약점 찾기
Shoulder를 사용하여 코드에서 Generation of Error Message Containing Sensitive Information 패턴을 스캔하세요. 5 규칙.
# Scan with Shoulder CLI npx @shoulderdev/cli trust --cwe=209 # Or scan entire project npx @shoulderdev/cli trust .
탐지 규칙 (5)
코드 리뷰에서 주의할 점
이 패턴은 잠재적인 Generation of Error Message Containing Sensitive Information 취약점을 나타냅니다. 코드 리뷰와 보안 감사 중에 찾아보세요.
코드베이스를 스캔하세요: Generation of Error Message Containing Sensitive Information
Shoulder CLI는 전체 코드베이스에서 취약한 패턴을 찾아냅니다.