@sun-asterisk/sunlint 1.3.46 → 1.3.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/rules/rules-registry-generated.json +1717 -282
- package/core/adapters/sunlint-rule-adapter.js +16 -0
- package/core/architecture-integration.js +57 -15
- package/core/cli-action-handler.js +51 -36
- package/core/config-manager.js +6 -0
- package/core/config-merger.js +33 -0
- package/core/config-validator.js +37 -2
- package/core/output-service.js +12 -3
- package/core/rule-selection-service.js +24 -3
- package/core/scoring-service.js +12 -6
- package/core/summary-report-service.js +9 -4
- package/engines/heuristic-engine.js +6 -1
- package/engines/impact/cli.js +54 -39
- package/engines/impact/config/default-config.js +105 -5
- package/engines/impact/core/impact-analyzer.js +12 -15
- package/engines/impact/core/utils/gitignore-parser.js +123 -0
- package/engines/impact/core/utils/method-call-graph.js +272 -87
- package/origin-rules/dart-en.md +1 -1
- package/origin-rules/go-en.md +231 -0
- package/origin-rules/php-en.md +107 -0
- package/origin-rules/python-en.md +113 -0
- package/origin-rules/ruby-en.md +607 -0
- package/package.json +2 -2
- package/scripts/copy-arch-detect.js +5 -1
- package/scripts/copy-impact-analyzer.js +5 -1
- package/scripts/generate-rules-registry.js +30 -14
- package/skill-assets/sunlint-code-quality/SKILL.md +3 -2
- package/skill-assets/sunlint-code-quality/rules/go/G001-explicit-error-handling.md +53 -0
- package/skill-assets/sunlint-code-quality/rules/go/G002-context-first-argument.md +44 -0
- package/skill-assets/sunlint-code-quality/rules/go/G003-receiver-consistency.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/go/G004-avoid-panic.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/G005-goroutine-leak-prevention.md +49 -0
- package/skill-assets/sunlint-code-quality/rules/go/G006-interface-consumer-definition.md +45 -0
- package/skill-assets/sunlint-code-quality/rules/go/GN001-gin-binding-validation.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/go/GN002-gin-error-response.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/go/GN003-graceful-shutdown.md +57 -0
- package/skill-assets/sunlint-code-quality/rules/go/GN004-gin-route-logical-grouping.md +54 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C006-verb-noun-functions.md +63 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C013-no-dead-code.md +48 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C014-dependency-injection.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C017-no-constructor-logic.md +42 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C018-generic-errors.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C019-error-log-level.md +41 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C020-no-unused-imports.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C022-no-unused-variables.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C023-no-duplicate-names.md +39 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C024-centralize-constants.md +35 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C029-catch-log-root-cause.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C030-custom-error-classes.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C033-separate-data-access.md +52 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C035-error-context-logging.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C041-no-hardcoded-secrets.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C042-boolean-naming.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C052-controller-parsing.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C060-superclass-logic.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/C067-no-hardcoded-config.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S003-open-redirect.md +58 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S004-no-log-credentials.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S005-server-authorization.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S006-default-credentials.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S007-output-encoding.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S009-approved-crypto.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S010-csprng.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S011-encrypted-client-hello.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S012-secrets-management.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S013-tls-connections.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S016-no-sensitive-query-string.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S017-parameterized-queries.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S019-email-input-sanitization.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S020-eval-code-execution.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S022-context-escaping.md +36 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S023-dynamic-js-encoding.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S025-server-validation.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S026-tls-encryption.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S027-mtls-validation.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S028-upload-limits.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S029-csrf-protection.md +32 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S030-directory-browsing.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S031-secure-cookie-flag.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S032-httponly-cookie.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S033-samesite-cookie.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S034-host-prefix-cookie.md +30 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S035-app-hostnames.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S036-internal-file-paths.md +37 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S037-anti-cache-headers.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S039-tls-certificate-validation.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S041-logout-invalidation.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S042-long-lived-sessions.md +27 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S044-critical-changes-reauth.md +34 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S045-brute-force-protection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S047-oauth-csrf-protection.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S048-oauth-redirect-validation.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S049-auth-code-expiry.md +31 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S050-token-entropy.md +26 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S051-password-length.md +38 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S052-otp-entropy.md +25 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S053-generic-error-messages.md +33 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S054-no-default-admin.md +29 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S055-content-type-validation.md +24 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S056-log-injection.md +28 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S057-synchronized-time.md +18 -0
- package/skill-assets/sunlint-code-quality/rules/ruby/S058-ssrf-protection.md +39 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validate Content-Type for Uploads
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents uploading of malicious executable files disguised as data
|
|
5
|
+
tags: security, uploads, validation, mimetypes
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Validate Content-Type for Uploads
|
|
9
|
+
|
|
10
|
+
Always validate the `Content-Type` and file extension of uploaded files. Check the magic bytes/file header rather than just the extension.
|
|
11
|
+
|
|
12
|
+
**Correct (ActiveStorage + Marcel):**
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
# Rails ActiveStorage uses Marcel gem to check magic bytes
|
|
16
|
+
class User < ApplicationRecord
|
|
17
|
+
has_one_attached :avatar
|
|
18
|
+
|
|
19
|
+
validates :avatar, content_type: ['image/png', 'image/jpeg']
|
|
20
|
+
end
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Tools:** ActiveStorage Validations gem
|
|
24
|
+
---
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Prevent Log Injection
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: prevents attackers from corrupting logs or misleading auditors
|
|
5
|
+
tags: security, logging, sanitization
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Prevent Log Injection
|
|
9
|
+
|
|
10
|
+
Sanitize all user-input data before including it in log files to prevent attackers from injecting newlines or carriage returns.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unsafe logging):**
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
# Attacker name: "admin\n[INFO] Login successful for admin"
|
|
16
|
+
logger.info "User update attempted by #{params[:user_name]}"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Correct (sanitized logging):**
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
# Replace newlines with spaces or use json logger
|
|
23
|
+
sanitized_name = params[:user_name].gsub(/[\n\r]/, " ")
|
|
24
|
+
logger.info "User update attempted by #{sanitized_name}"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Tools:** Lograge (default Rails JSON logging avoids this)
|
|
28
|
+
---
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Ensure Synchronized System Time
|
|
3
|
+
impact: LOW
|
|
4
|
+
impactDescription: crucial for log correlation, audit trails, and time-based security tokens
|
|
5
|
+
tags: security, infrastructure, timing
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Ensure Synchronized System Time
|
|
9
|
+
|
|
10
|
+
Ensure all servers in your environment are synchronized using a network time protocol (NTP). This is critical for authentication tokens (OTP, JWT) and log correlation.
|
|
11
|
+
|
|
12
|
+
**Details:**
|
|
13
|
+
- Configure NTP/Chrony on all production servers.
|
|
14
|
+
- Monitor time synchronization offset.
|
|
15
|
+
- Important for TOTP (MFA) and token expiry checks.
|
|
16
|
+
|
|
17
|
+
**Tools:** NTP, Chrony, CloudWatch Time Sync
|
|
18
|
+
---
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Prevent Server-Side Request Forgery (SSRF)
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents attackers from accessing internal resources or services
|
|
5
|
+
tags: security, ssrf, vulnerability, net-http
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Prevent Server-Side Request Forgery (SSRF)
|
|
9
|
+
|
|
10
|
+
Never allow users to provide the full URL or IP address for your server to fetch. Use an allow-list of domains or a secure proxy.
|
|
11
|
+
|
|
12
|
+
**Incorrect (unvalidated SSRF):**
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
def fetch_external_report
|
|
16
|
+
# Attacker url: http://localhost:5432 or http://169.254.169.254/metadata
|
|
17
|
+
response = Net::HTTP.get(URI(params[:url]))
|
|
18
|
+
render body: response
|
|
19
|
+
end
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (validated domain):**
|
|
23
|
+
|
|
24
|
+
```ruby
|
|
25
|
+
ALLOWED_DOMAINS = ['trusted-report-source.com']
|
|
26
|
+
|
|
27
|
+
def fetch_external_report
|
|
28
|
+
uri = URI(params[:url])
|
|
29
|
+
if ALLOWED_DOMAINS.include?(uri.host)
|
|
30
|
+
response = Net::HTTP.get(uri)
|
|
31
|
+
render body: response
|
|
32
|
+
else
|
|
33
|
+
render_403
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Tools:** Brakeman, ssrf_filter gem
|
|
39
|
+
---
|