191 lines
5.0 KiB
Plaintext
191 lines
5.0 KiB
Plaintext
![]() |
include::../description.adoc[]
|
||
|
|
||
|
include::../ask-yourself.adoc[]
|
||
|
|
||
|
include::../recommended.adoc[]
|
||
|
|
||
|
== Sensitive Code Example
|
||
|
|
||
|
For https://pkg.go.dev/runtime/debug[debug package in Go Standard Library:]
|
||
|
|
||
|
``++debug.PrintStack()++`` prints a stack trace to the standard error output (by default) which can expose sensitive information:
|
||
|
|
||
|
[source,go,diff-id=1,diff-type=noncompliant]
|
||
|
----
|
||
|
import "runtime/debug"
|
||
|
|
||
|
_, err := funcThatFails()
|
||
|
if err != nil {
|
||
|
fmt.Printf("Error calling funcThatFails: %v\n", err)
|
||
|
debug.PrintStack() // Sensitive
|
||
|
return
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/runtime/pprof[pprof package in Go Standard Library:]
|
||
|
|
||
|
[source,go,diff-id=2,diff-type=noncompliant]
|
||
|
----
|
||
|
func main() {
|
||
|
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) // Sensitive
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/net/http/pprof[http/pprof package in Go Standard Library:]
|
||
|
|
||
|
Importing ``++net/http/pprof++`` adds several https://pkg.go.dev/net/http/pprof[HTTP handlers] that expose runtime profiling data about the current process:
|
||
|
|
||
|
[source,go,diff-id=3,diff-type=noncompliant]
|
||
|
----
|
||
|
import (
|
||
|
"net/http"
|
||
|
_ "net/http/pprof" // Sensitive
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// Start an HTTP server that will reply (because of the importation of "net/http/pprof") to various commands
|
||
|
http.ListenAndServe(":6060", nil)
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/net/http/httputil[httputil package in Go Standard Library:]
|
||
|
|
||
|
``++httputil.DumpRequest()++`` generates a dump of an HTTP request and can expose sensitive information:
|
||
|
|
||
|
[source,go,diff-id=4,diff-type=noncompliant]
|
||
|
----
|
||
|
func requestHandler(w http.ResponseWriter, req *http.Request) {
|
||
|
dump, err := httputil.DumpRequest(req, true) // Sensitive
|
||
|
if err == nil {
|
||
|
fmt.Printf("%q", dump)
|
||
|
return
|
||
|
}
|
||
|
...
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/gorm.io/gorm[GORM Library:]
|
||
|
|
||
|
ORM libraries like GORM often allow logging SQL queries that may expose sensitive information:
|
||
|
|
||
|
[source,go,diff-id=5,diff-type=noncompliant]
|
||
|
----
|
||
|
import (
|
||
|
"gorm.io/driver/sqlite"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
|
||
|
Logger: logger.Default.LogMode(logger.Info), // Sensitive
|
||
|
})
|
||
|
if err != nil {
|
||
|
panic("failed to connect database")
|
||
|
}
|
||
|
|
||
|
db.Debug().Create(&User{Account: acccount, Password: password}) // Sensitive
|
||
|
----
|
||
|
|
||
|
== Compliant Solution
|
||
|
|
||
|
For https://pkg.go.dev/runtime/debug[debug package in Go Standard Library:]
|
||
|
|
||
|
Stack trace should not be printed in production:
|
||
|
|
||
|
[source,go,diff-id=1,diff-type=compliant]
|
||
|
----
|
||
|
_, err := funcThatFails()
|
||
|
if err != nil {
|
||
|
fmt.Printf("Error calling funcThatFails: %v\n", err)
|
||
|
// Compliant: Does not call debug.PrintStack()
|
||
|
return
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/runtime/pprof[pprof package in Go Standard Library:]
|
||
|
|
||
|
Avoid calling methods such as `pprof.Profile.WriteTo` in production.
|
||
|
|
||
|
[source,go,diff-id=2,diff-type=compliant]
|
||
|
----
|
||
|
func main() {
|
||
|
// Compliant: Does not call pprof.Profile.WriteTo
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/net/http/pprof[http/pprof package in Go Standard Library:]
|
||
|
|
||
|
Do not import ``++net/http/pprof++`` or ensure the HTTP handlers can't be accessed by end-users.
|
||
|
|
||
|
[source,go,diff-id=3,diff-type=compliant]
|
||
|
----
|
||
|
import (
|
||
|
"net/http"
|
||
|
// Compliant: Does not import "net/http/pprof"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// Start an HTTP server
|
||
|
http.ListenAndServe(":6060", nil)
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/net/http/httputil[httputil package in Go Standard Library:]
|
||
|
|
||
|
Avoid calling methods such as `httputil.DumpRequest()` in production.
|
||
|
|
||
|
[source,go,diff-id=4,diff-type=compliant]
|
||
|
----
|
||
|
func requestHandler(w http.ResponseWriter, req *http.Request) {
|
||
|
// Compliant: Does not call httputil.DumpRequest
|
||
|
}
|
||
|
----
|
||
|
|
||
|
For https://pkg.go.dev/gorm.io/gorm[GORM Library:]
|
||
|
|
||
|
Configure loggers to not log debug-level information. GORM writes debug-level information when configured with the `Info` logging mode. Avoid using the `DB.Debug()` method as it creates a new `Session` that always logs debug-level information.
|
||
|
|
||
|
[source,go,diff-id=5,diff-type=compliant]
|
||
|
----
|
||
|
import (
|
||
|
"gorm.io/driver/sqlite"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
|
||
|
Logger: logger.Default.LogMode(logger.Warn), // Compliant
|
||
|
})
|
||
|
if err != nil {
|
||
|
panic("failed to connect database")
|
||
|
}
|
||
|
|
||
|
db.Create(&User{Account: acccount, Password: password}) // Compliant: Debug() is not called
|
||
|
----
|
||
|
|
||
|
include::../see.adoc[]
|
||
|
|
||
|
ifdef::env-github,rspecator-view[]
|
||
|
|
||
|
'''
|
||
|
== Implementation Specification
|
||
|
(visible only on this page)
|
||
|
|
||
|
include::../message.adoc[]
|
||
|
|
||
|
=== Highlighting
|
||
|
|
||
|
Highlight the following:
|
||
|
|
||
|
* The function ``++PrintStack++`` from the package ``++runtime/debug++``.
|
||
|
* The method ``++WriteTo++`` of the type ``++Profile++`` from the package ``++runtime/pprof++``.
|
||
|
* The name of the package ``++net/http/pprof++`` when it is imported.
|
||
|
* The functions ``++DumpRequest++`` and ``++DumpResponse++`` from the package ``++net/http/httputil++``.
|
||
|
* The method ``++Debug++`` of the type ``++DB++`` from the package ``++gorm.io/gorm++``.
|
||
|
* The value `Info` of the type ``++LogLevel++`` from the package ``++gorm.io/gorm++``.
|
||
|
|
||
|
'''
|
||
|
== Comments And Links
|
||
|
(visible only on this page)
|
||
|
|
||
|
include::../comments-and-links.adoc[]
|
||
|
|
||
|
endif::env-github,rspecator-view[]
|