@sun-asterisk/sunlint 1.3.40 → 1.3.41

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.
Files changed (67) hide show
  1. package/core/rule-selection-service.js +11 -0
  2. package/package.json +1 -1
  3. package/skill-assets/sunlint-code-quality/rules/go/C006-verb-noun-functions.md +45 -0
  4. package/skill-assets/sunlint-code-quality/rules/go/C013-no-dead-code.md +48 -0
  5. package/skill-assets/sunlint-code-quality/rules/go/C014-dependency-injection.md +85 -0
  6. package/skill-assets/sunlint-code-quality/rules/go/C017-no-constructor-logic.md +67 -0
  7. package/skill-assets/sunlint-code-quality/rules/go/C018-generic-errors.md +63 -0
  8. package/skill-assets/sunlint-code-quality/rules/go/C019-error-log-level.md +50 -0
  9. package/skill-assets/sunlint-code-quality/rules/go/C020-no-unused-imports.md +45 -0
  10. package/skill-assets/sunlint-code-quality/rules/go/C022-no-unused-variables.md +34 -0
  11. package/skill-assets/sunlint-code-quality/rules/go/C023-no-duplicate-names.md +41 -0
  12. package/skill-assets/sunlint-code-quality/rules/go/C024-centralize-constants.md +55 -0
  13. package/skill-assets/sunlint-code-quality/rules/go/C029-catch-log-root-cause.md +56 -0
  14. package/skill-assets/sunlint-code-quality/rules/go/C030-custom-error-classes.md +69 -0
  15. package/skill-assets/sunlint-code-quality/rules/go/C033-separate-data-access.md +68 -0
  16. package/skill-assets/sunlint-code-quality/rules/go/C035-error-context-logging.md +48 -0
  17. package/skill-assets/sunlint-code-quality/rules/go/C041-no-hardcoded-secrets.md +45 -0
  18. package/skill-assets/sunlint-code-quality/rules/go/C042-boolean-naming.md +42 -0
  19. package/skill-assets/sunlint-code-quality/rules/go/C052-controller-parsing.md +62 -0
  20. package/skill-assets/sunlint-code-quality/rules/go/C060-superclass-logic.md +60 -0
  21. package/skill-assets/sunlint-code-quality/rules/go/C067-no-hardcoded-config.md +51 -0
  22. package/skill-assets/sunlint-code-quality/rules/go/S003-open-redirect.md +80 -0
  23. package/skill-assets/sunlint-code-quality/rules/go/S004-no-log-credentials.md +66 -0
  24. package/skill-assets/sunlint-code-quality/rules/go/S005-server-authorization.md +55 -0
  25. package/skill-assets/sunlint-code-quality/rules/go/S006-default-credentials.md +47 -0
  26. package/skill-assets/sunlint-code-quality/rules/go/S007-output-encoding.md +50 -0
  27. package/skill-assets/sunlint-code-quality/rules/go/S009-approved-crypto.md +63 -0
  28. package/skill-assets/sunlint-code-quality/rules/go/S010-csprng.md +53 -0
  29. package/skill-assets/sunlint-code-quality/rules/go/S011-encrypted-client-hello.md +34 -0
  30. package/skill-assets/sunlint-code-quality/rules/go/S012-secrets-management.md +49 -0
  31. package/skill-assets/sunlint-code-quality/rules/go/S013-tls-connections.md +61 -0
  32. package/skill-assets/sunlint-code-quality/rules/go/S016-no-sensitive-query-string.md +42 -0
  33. package/skill-assets/sunlint-code-quality/rules/go/S017-parameterized-queries.md +36 -0
  34. package/skill-assets/sunlint-code-quality/rules/go/S019-email-input-sanitization.md +44 -0
  35. package/skill-assets/sunlint-code-quality/rules/go/S020-eval-code-execution.md +47 -0
  36. package/skill-assets/sunlint-code-quality/rules/go/S022-context-escaping.md +49 -0
  37. package/skill-assets/sunlint-code-quality/rules/go/S023-dynamic-js-encoding.md +51 -0
  38. package/skill-assets/sunlint-code-quality/rules/go/S025-server-validation.md +57 -0
  39. package/skill-assets/sunlint-code-quality/rules/go/S026-tls-encryption.md +46 -0
  40. package/skill-assets/sunlint-code-quality/rules/go/S027-mtls-validation.md +52 -0
  41. package/skill-assets/sunlint-code-quality/rules/go/S028-upload-limits.md +58 -0
  42. package/skill-assets/sunlint-code-quality/rules/go/S029-csrf-protection.md +53 -0
  43. package/skill-assets/sunlint-code-quality/rules/go/S030-directory-browsing.md +53 -0
  44. package/skill-assets/sunlint-code-quality/rules/go/S031-secure-cookie-flag.md +48 -0
  45. package/skill-assets/sunlint-code-quality/rules/go/S032-httponly-cookie.md +42 -0
  46. package/skill-assets/sunlint-code-quality/rules/go/S033-samesite-cookie.md +49 -0
  47. package/skill-assets/sunlint-code-quality/rules/go/S034-host-prefix-cookie.md +44 -0
  48. package/skill-assets/sunlint-code-quality/rules/go/S035-app-hostnames.md +50 -0
  49. package/skill-assets/sunlint-code-quality/rules/go/S036-internal-file-paths.md +56 -0
  50. package/skill-assets/sunlint-code-quality/rules/go/S037-anti-cache-headers.md +43 -0
  51. package/skill-assets/sunlint-code-quality/rules/go/S039-tls-certificate-validation.md +41 -0
  52. package/skill-assets/sunlint-code-quality/rules/go/S041-logout-invalidation.md +46 -0
  53. package/skill-assets/sunlint-code-quality/rules/go/S042-long-lived-sessions.md +58 -0
  54. package/skill-assets/sunlint-code-quality/rules/go/S044-critical-changes-reauth.md +53 -0
  55. package/skill-assets/sunlint-code-quality/rules/go/S045-brute-force-protection.md +55 -0
  56. package/skill-assets/sunlint-code-quality/rules/go/S047-oauth-csrf-protection.md +51 -0
  57. package/skill-assets/sunlint-code-quality/rules/go/S048-oauth-redirect-validation.md +58 -0
  58. package/skill-assets/sunlint-code-quality/rules/go/S049-auth-code-expiry.md +52 -0
  59. package/skill-assets/sunlint-code-quality/rules/go/S050-token-entropy.md +53 -0
  60. package/skill-assets/sunlint-code-quality/rules/go/S051-password-length.md +49 -0
  61. package/skill-assets/sunlint-code-quality/rules/go/S052-otp-entropy.md +48 -0
  62. package/skill-assets/sunlint-code-quality/rules/go/S053-generic-error-messages.md +51 -0
  63. package/skill-assets/sunlint-code-quality/rules/go/S054-no-default-admin.md +43 -0
  64. package/skill-assets/sunlint-code-quality/rules/go/S055-content-type-validation.md +52 -0
  65. package/skill-assets/sunlint-code-quality/rules/go/S056-log-injection.md +40 -0
  66. package/skill-assets/sunlint-code-quality/rules/go/S057-synchronized-time.md +40 -0
  67. package/skill-assets/sunlint-code-quality/rules/go/S058-ssrf-protection.md +70 -0
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: Protect Against SSRF Attacks
3
+ impact: MEDIUM
4
+ impactDescription: prevents internal network access from user input
5
+ tags: ssrf, url, network, internal, security
6
+ ---
7
+
8
+ ## Protect Against SSRF Attacks
9
+
10
+ SSRF allows attackers to make requests from your server to internal services, local files, or cloud metadata endpoints.
11
+
12
+ **Incorrect (accepting user URLs without validation):**
13
+
14
+ ```go
15
+ func Handler(w http.ResponseWriter, r *http.Request) {
16
+ url := r.URL.Query().Get("url")
17
+ resp, _ := http.Get(url) // Attacker controls URL!
18
+ io.Copy(w, resp.Body)
19
+ }
20
+ // Attacker: ?url=http://169.254.169.254/latest/meta-data/
21
+ ```
22
+
23
+ **Correct (URL validation and IP blocking):**
24
+
25
+ ```go
26
+ import (
27
+ "net"
28
+ "net/url"
29
+ )
30
+
31
+ var allowedHosts = []string{"api.example.com", "cdn.example.com"}
32
+
33
+ func SafeFetch(userURL string) (*http.Response, error) {
34
+ parsed, err := url.Parse(userURL)
35
+ if err != nil {
36
+ return nil, err
37
+ }
38
+
39
+ // 1. Protocol whitelist
40
+ if parsed.Scheme != "http" && parsed.Scheme != "https" {
41
+ return nil, errors.New("protocol not allowed")
42
+ }
43
+
44
+ // 2. Host whitelist
45
+ isAllowed := false
46
+ for _, h := range allowedHosts {
47
+ if parsed.Hostname() == h {
48
+ isAllowed = true
49
+ break
50
+ }
51
+ }
52
+
53
+ // 3. Resolve IP and block internal ranges
54
+ ips, _ := net.LookupIP(parsed.Hostname())
55
+ for _, ip := range ips {
56
+ if ip.IsLoopback() || ip.IsPrivate() || ip.IsUnspecified() {
57
+ return nil, errors.New("internal IP blocked")
58
+ }
59
+ }
60
+
61
+ client := &http.Client{
62
+ CheckRedirect: func(req *http.Request, via []*http.Request) error {
63
+ return http.ErrUseLastResponse // Disable redirects
64
+ },
65
+ }
66
+ return client.Get(userURL)
67
+ }
68
+ ```
69
+
70
+ **Tools:** `net/url`, `net.LookupIP`, `gosec` (G107)