Skip to content

Commit fe13d1a

Browse files
tinamthomassvishwanath-tw
authored andcommitted
FileContent Detector should account for allowed patterns in talismanRC
1 parent aafbc40 commit fe13d1a

File tree

6 files changed

+95
-38
lines changed

6 files changed

+95
-38
lines changed

.talismanrc

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fileignoreconfig:
1111
ignore_detectors:
1212
- filecontent
1313
- filename: detector/filecontent/filecontent_detector_test.go
14-
checksum: affb25839a87476dcef4f4169ccb9b54b2d2f2437cef3aca24f4d3b69d5886c5
14+
checksum: 05d00bb99452d37ab45de28c9e074357e5be22a80d95dad1b2cdd01074b25b2a
1515
- filename: detector/filename/filename_detector.go
1616
checksum: 5404565683a7e812fa98ff2d14237c4d1ba7dc5b4aca2dd3ba663b33dc8ddae7
1717
- filename: detector/filename/filename_detector_test.go
@@ -32,6 +32,8 @@ fileignoreconfig:
3232
checksum: bf0da9b8b6f779f502564166323a903a49b56b9d8df2597729a5b96c8f066074
3333
- filename: install.sh
3434
checksum: c909f6a1caefba3f196d489f9262608044be596a44793c2173ec55b98ecec649
35+
- filename: talismanrc/talismanrc_test.go
36+
checksum: eab40d0745dc215267da86ef7f926be77c4d46e9a248dadbc7e52aa186e82853
3537
scopeconfig:
3638
- scope: go
3739
version: "1.0"

detector/filecontent/filecontent_detector.go

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ func (fc *FileContentDetector) Test(comparator helpers.ChecksumCompare, currentA
119119
data := []byte(content)
120120
addition.Data = data
121121
}
122+
addition.Data = []byte(talismanRC.FilterAllowedPatternsFromAddition(addition))
122123
for _, ct := range contentTypes {
123124
contents <- content{
124125
name: addition.Name,

detector/filecontent/filecontent_detector_test.go

+35-15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package filecontent
22

33
import (
44
"fmt"
5+
"regexp"
56
"strings"
67
"talisman/detector/helpers"
78
"talisman/detector/severity"
@@ -20,10 +21,10 @@ var emptyTalismanRC = &talismanrc.TalismanRC{IgnoreConfigs: []talismanrc.IgnoreC
2021
var defaultChecksumCompareUtility = helpers.
2122
NewChecksumCompare(nil, utility.MakeHasher("default", "."), emptyTalismanRC)
2223
var dummyCallback = func() {}
24+
var filename = "filename"
2325

2426
func TestShouldNotFlagSafeText(t *testing.T) {
2527
results := helpers.NewDetectionResults(talismanrc.HookMode)
26-
filename := "filename"
2728
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte("prettySafe"))}
2829

2930
NewFileContentDetector(emptyTalismanRC).
@@ -33,7 +34,6 @@ func TestShouldNotFlagSafeText(t *testing.T) {
3334

3435
func TestShouldIgnoreFileIfNeeded(t *testing.T) {
3536
results := helpers.NewDetectionResults(talismanrc.HookMode)
36-
filename := "filename"
3737
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte("prettySafe"))}
3838
talismanRCIWithFilenameIgnore := &talismanrc.TalismanRC{
3939
IgnoreConfigs: []talismanrc.IgnoreConfig{
@@ -59,7 +59,6 @@ func TestShouldNotFlag4CharSafeText(t *testing.T) {
5959
the encoded value of i· rather just a plain abcd input see
6060
stackoverflow.com/questions/8571501/how-to-check-whether-the-string-is-base64-encoded-or-not#comment23919648_8571649*/
6161
results := helpers.NewDetectionResults(talismanrc.HookMode)
62-
filename := "filename"
6362
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte("abcd"))}
6463

6564
NewFileContentDetector(emptyTalismanRC).
@@ -71,7 +70,6 @@ func TestShouldNotFlagLowEntropyBase64Text(t *testing.T) {
7170
const lowEntropyString string = "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEK"
7271
results := helpers.NewDetectionResults(talismanrc.HookMode)
7372
content := []byte(lowEntropyString)
74-
filename := "filename"
7573
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, content)}
7674

7775
NewFileContentDetector(emptyTalismanRC).
@@ -82,7 +80,6 @@ func TestShouldNotFlagLowEntropyBase64Text(t *testing.T) {
8280
func TestShouldFlagPotentialAWSSecretKeys(t *testing.T) {
8381
const awsSecretAccessKey string = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
8482
results := helpers.NewDetectionResults(talismanrc.HookMode)
85-
filename := "filename"
8683
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(awsSecretAccessKey))}
8784
filePath := additions[0].Path
8885

@@ -99,7 +96,6 @@ func TestShouldFlagPotentialAWSSecretKeys(t *testing.T) {
9996
func TestShouldFlagPotentialSecretWithoutTrimmingWhenLengthLessThan50Characters(t *testing.T) {
10097
const secret string = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9asdfa"
10198
results := helpers.NewDetectionResults(talismanrc.HookMode)
102-
filename := "filename"
10399
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(secret))}
104100
filePath := additions[0].Path
105101

@@ -117,7 +113,6 @@ func TestShouldFlagPotentialJWT(t *testing.T) {
117113
"OiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f757"
118114
results := helpers.NewDetectionResults(talismanrc.HookMode)
119115
content := []byte(jwt)
120-
filename := "filename"
121116
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, content)}
122117
filePath := additions[0].Path
123118

@@ -141,7 +136,6 @@ func TestShouldFlagPotentialSecretsWithinJavaCode(t *testing.T) {
141136
"}"
142137
results := helpers.NewDetectionResults(talismanrc.HookMode)
143138
content := []byte(dangerousJavaCode)
144-
filename := "filename"
145139
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, content)}
146140
filePath := additions[0].Path
147141

@@ -162,7 +156,6 @@ func TestShouldNotFlagPotentialSecretsWithinSafeJavaCode(t *testing.T) {
162156
" }\r\n\r\n" +
163157
"}"
164158
results := helpers.NewDetectionResults(talismanrc.HookMode)
165-
filename := "filename"
166159
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(safeJavaCode))}
167160

168161
NewFileContentDetector(emptyTalismanRC).
@@ -173,7 +166,6 @@ func TestShouldNotFlagPotentialSecretsWithinSafeJavaCode(t *testing.T) {
173166
func TestShouldNotFlagPotentialSecretsWithinSafeLongMethodName(t *testing.T) {
174167
safeLongMethodName := "TestBase64DetectorShouldNotDetectLongMethodNamesEvenWithRidiculousHighEntropyWordsMightExist"
175168
results := helpers.NewDetectionResults(talismanrc.HookMode)
176-
filename := "filename"
177169
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(safeLongMethodName))}
178170

179171
NewFileContentDetector(emptyTalismanRC).
@@ -184,7 +176,6 @@ func TestShouldNotFlagPotentialSecretsWithinSafeLongMethodName(t *testing.T) {
184176
func TestShouldFlagPotentialSecretsEncodedInHex(t *testing.T) {
185177
const hex string = "68656C6C6F20776F726C6421"
186178
results := helpers.NewDetectionResults(talismanrc.HookMode)
187-
filename := "filename"
188179
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(hex))}
189180
filePath := additions[0].Path
190181

@@ -198,7 +189,6 @@ func TestShouldFlagPotentialSecretsEncodedInHex(t *testing.T) {
198189
func TestShouldNotFlagPotentialCreditCardNumberIfAboveThreshold(t *testing.T) {
199190
const creditCardNumber string = "340000000000009"
200191
results := helpers.NewDetectionResults(talismanrc.HookMode)
201-
filename := "filename"
202192
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(creditCardNumber))}
203193
talismanRCWithThreshold := &talismanrc.TalismanRC{Threshold: severity.High}
204194
checksumCompareWithThreshold := helpers.
@@ -210,12 +200,44 @@ func TestShouldNotFlagPotentialCreditCardNumberIfAboveThreshold(t *testing.T) {
210200
assert.False(t, results.HasFailures(), "Expected no base64 detection when threshold is higher")
211201
}
212202

203+
func TestShouldNotFlagPotentialSecretsIfIgnored(t *testing.T) {
204+
const hex string = "68656C6C6F20776F726C6421"
205+
talismanRCWithIgnores := &talismanrc.TalismanRC{
206+
AllowedPatterns: []*regexp.Regexp{regexp.MustCompile("[0-9a-fA-F]*")}}
207+
results := helpers.NewDetectionResults(talismanrc.HookMode)
208+
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(hex))}
209+
210+
NewFileContentDetector(emptyTalismanRC).
211+
Test(defaultChecksumCompareUtility, additions, talismanRCWithIgnores, results, dummyCallback)
212+
213+
assert.False(t, results.HasFailures(), "Expected file ignore allowed pattern for hex text")
214+
}
215+
216+
func TestResultsShouldNotFlagCreditCardNumberIfSpecifiedInFileIgnores(t *testing.T) {
217+
const creditCardNumber string = "340000000000009"
218+
results := helpers.NewDetectionResults(talismanrc.HookMode)
219+
fileIgnoreConfig := &talismanrc.FileIgnoreConfig{
220+
FileName: filename, Checksum: "",
221+
AllowedPatterns: []string{creditCardNumber},
222+
}
223+
talismanRCWithFileIgnore := &talismanrc.TalismanRC{
224+
IgnoreConfigs: []talismanrc.IgnoreConfig{fileIgnoreConfig},
225+
}
226+
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(creditCardNumber))}
227+
228+
NewFileContentDetector(emptyTalismanRC).
229+
Test(defaultChecksumCompareUtility, additions, talismanRCWithFileIgnore, results, dummyCallback)
230+
231+
assert.False(t, results.HasFailures(), "Expected the creditcard number to be ignored based on talisman RC")
232+
233+
}
234+
235+
213236
func TestResultsShouldContainHexTextsIfHexAndBase64ExistInFile(t *testing.T) {
214237
const hex string = "68656C6C6F20776F726C6421"
215238
const base64 string = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
216239
const hexAndBase64 = hex + "\n" + base64
217240
results := helpers.NewDetectionResults(talismanrc.HookMode)
218-
filename := "filename"
219241
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(hexAndBase64))}
220242
filePath := additions[0].Path
221243

@@ -232,7 +254,6 @@ func TestResultsShouldContainBase64TextsIfHexAndBase64ExistInFile(t *testing.T)
232254
const base64 string = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
233255
const hexAndBase64 = hex + "\n" + base64
234256
results := helpers.NewDetectionResults(talismanrc.HookMode)
235-
filename := "filename"
236257
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(hexAndBase64))}
237258
filePath := additions[0].Path
238259

@@ -248,7 +269,6 @@ func TestResultsShouldContainBase64TextsIfHexAndBase64ExistInFile(t *testing.T)
248269
func TestResultsShouldContainCreditCardNumberIfCreditCardNumberExistInFile(t *testing.T) {
249270
const creditCardNumber string = "340000000000009"
250271
results := helpers.NewDetectionResults(talismanrc.HookMode)
251-
filename := "filename"
252272
additions := []gitrepo.Addition{gitrepo.NewAddition(filename, []byte(creditCardNumber))}
253273
filePath := additions[0].Path
254274

detector/pattern/pattern_detector.go

+1-19
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (detector PatternDetector) Test(comparator helpers.ChecksumCompare, current
5050
ignoredFilePaths <- addition.Path
5151
return
5252
}
53-
detections := detector.secretsPattern.check(processAllowedPatterns(addition, ignoreConfig), ignoreConfig.Threshold)
53+
detections := detector.secretsPattern.check(ignoreConfig.FilterAllowedPatternsFromAddition(addition), ignoreConfig.Threshold)
5454
matches <- match{name: addition.Name, path: addition.Path, detections: detections, commits: addition.Commits}
5555
}(addition)
5656
}
@@ -77,24 +77,6 @@ func (detector PatternDetector) Test(comparator helpers.ChecksumCompare, current
7777
}
7878
}
7979

80-
func processAllowedPatterns(addition gitrepo.Addition, tRC *talismanrc.TalismanRC) string {
81-
additionPathAsString := string(addition.Path)
82-
// Processing global allowed patterns
83-
for _, pattern := range tRC.AllowedPatterns {
84-
addition.Data = pattern.ReplaceAll(addition.Data, []byte(""))
85-
}
86-
87-
// Processing allowed patterns based on file path
88-
for _, ignoreConfig := range tRC.IgnoreConfigs {
89-
if ignoreConfig.GetFileName() == additionPathAsString {
90-
for _, pattern := range ignoreConfig.GetAllowedPatterns() {
91-
addition.Data = pattern.ReplaceAll(addition.Data, []byte(""))
92-
}
93-
}
94-
}
95-
return string(addition.Data)
96-
}
97-
9880
func (detector PatternDetector) processIgnore(ignoredFilePath gitrepo.FilePath, result *helpers.DetectionResults) {
9981
log.WithFields(log.Fields{
10082
"filePath": ignoredFilePath,

talismanrc/talismanrc.go

+19
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,25 @@ func (tRC *TalismanRC) Deny(addition gitrepo.Addition, detectorName string) bool
164164
return false
165165
}
166166

167+
//Strip git addition
168+
func(tRC *TalismanRC) FilterAllowedPatternsFromAddition(addition gitrepo.Addition) string {
169+
additionPathAsString := string(addition.Path)
170+
// Processing global allowed patterns
171+
for _, pattern := range tRC.AllowedPatterns {
172+
addition.Data = pattern.ReplaceAll(addition.Data, []byte(""))
173+
}
174+
175+
// Processing allowed patterns based on file path
176+
for _, ignoreConfig := range tRC.IgnoreConfigs {
177+
if ignoreConfig.GetFileName() == additionPathAsString {
178+
for _, pattern := range ignoreConfig.GetAllowedPatterns() {
179+
addition.Data = pattern.ReplaceAll(addition.Data, []byte(""))
180+
}
181+
}
182+
}
183+
return string(addition.Data)
184+
}
185+
167186
func (tRC *TalismanRC) effectiveRules(detectorName string) []string {
168187
var result []string
169188
for _, ignore := range tRC.IgnoreConfigs {

talismanrc/talismanrc_test.go

+36-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"io/ioutil"
66
"os"
7+
"regexp"
78
"testing"
89

910
"talisman/detector/severity"
@@ -47,6 +48,31 @@ func TestShouldIgnoreUnformattedFiles(t *testing.T) {
4748
setRepoFileReader(defaultRepoFileReader)
4849
}
4950

51+
func TestShouldFilterAllowedPatternsFromAddition(t *testing.T) {
52+
const hex string = "68656C6C6F20776F726C6421"
53+
const fileContent string = "Prefix content" + hex
54+
gitRepoAddition1 := testAdditionWithData("file1", []byte(fileContent))
55+
talismanrc := &TalismanRC{AllowedPatterns: []*regexp.Regexp{regexp.MustCompile(hex)}}
56+
57+
fileContentFiltered := talismanrc.FilterAllowedPatternsFromAddition(gitRepoAddition1)
58+
59+
assert.Equal(t, fileContentFiltered, "Prefix content")
60+
}
61+
62+
func TestShouldFilterAllowedPatternsFromAdditionBasedOnFileConfig(t *testing.T) {
63+
const hexContent string = "68656C6C6F20776F726C6421"
64+
const fileContent string = "Prefix content" + hexContent
65+
gitRepoAddition1 := testAdditionWithData("file1", []byte(fileContent))
66+
gitRepoAddition2 := testAdditionWithData("file2", []byte(fileContent))
67+
talismanrc := createTalismanRCWithFileIgnores("file1", "somedetector", []string{hexContent})
68+
69+
fileContentFiltered1 := talismanrc.FilterAllowedPatternsFromAddition(gitRepoAddition1)
70+
fileContentFiltered2 := talismanrc.FilterAllowedPatternsFromAddition(gitRepoAddition2)
71+
72+
assert.Equal(t, fileContentFiltered1, "Prefix content")
73+
assert.Equal(t, fileContentFiltered2, fileContent)
74+
}
75+
5076
func TestShouldConvertThresholdToValue(t *testing.T) {
5177
talismanRCContents := []byte("threshold: high")
5278
assert.Equal(t, newPersistedRC(talismanRCContents).Threshold, severity.High)
@@ -142,27 +168,34 @@ func assertDenies(line, ignoreDetector string, path string, t *testing.T) {
142168
}
143169

144170
func assertDeniesDetector(line, ignoreDetector string, path string, detectorName string, t *testing.T) {
145-
assert.True(t, createTalismanRCWithFileIgnores(line, ignoreDetector).Deny(testAddition(path), detectorName), "%s is expected to deny a file named %s.", line, path)
171+
assert.True(t, createTalismanRCWithFileIgnores(line, ignoreDetector, []string{}).Deny(testAddition(path), detectorName), "%s is expected to deny a file named %s.", line, path)
146172
}
147173

148174
func assertAccepts(line, ignoreDetector string, path string, t *testing.T, detectorNames ...string) {
149175
assertAcceptsDetector(line, ignoreDetector, path, "someDetector", t)
150176
}
151177

152178
func assertAcceptsDetector(line, ignoreDetector string, path string, detectorName string, t *testing.T) {
153-
assert.True(t, createTalismanRCWithFileIgnores(line, ignoreDetector).Accept(testAddition(path), detectorName), "%s is expected to accept a file named %s.", line, path)
179+
assert.True(t, createTalismanRCWithFileIgnores(line, ignoreDetector, []string{}).Accept(testAddition(path), detectorName), "%s is expected to accept a file named %s.", line, path)
154180
}
155181

156182
func testAddition(path string) gitrepo.Addition {
157183
return gitrepo.NewAddition(path, make([]byte, 0))
158184
}
159185

160-
func createTalismanRCWithFileIgnores(filename string, detector string) *TalismanRC {
186+
func testAdditionWithData(path string, content []byte) gitrepo.Addition {
187+
return gitrepo.NewAddition(path, content)
188+
}
189+
190+
func createTalismanRCWithFileIgnores(filename string, detector string, allowedPatterns []string) *TalismanRC {
161191
fileIgnoreConfig := &FileIgnoreConfig{}
162192
fileIgnoreConfig.FileName = filename
163193
if detector != "" {
164194
fileIgnoreConfig.IgnoreDetectors = []string{detector}
165195
}
196+
if len(allowedPatterns) != 0 {
197+
fileIgnoreConfig.AllowedPatterns = allowedPatterns
198+
}
166199

167200
return &TalismanRC{IgnoreConfigs: []IgnoreConfig{fileIgnoreConfig}}
168201
}

0 commit comments

Comments
 (0)