1
// Copyright Istio Authors
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
7
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
21
fuzz "github.com/AdaLogics/go-fuzz-headers"
23
"istio.io/istio/pkg/config"
24
"istio.io/istio/pkg/config/analysis"
25
"istio.io/istio/pkg/config/analysis/analyzers"
26
"istio.io/istio/pkg/config/analysis/local"
27
"istio.io/istio/pkg/config/analysis/scope"
28
"istio.io/istio/pkg/log"
31
var availableAnalyzers = analyzers.All()
33
// createRandomConfigFile creates a single fuzzed config file
34
func createRandomConfigFile(f *fuzz.ConsumeFuzzer) (string, error) {
35
data, err := f.GetBytes()
39
tmpfile, err := os.CreateTemp("", "example")
43
if _, err := tmpfile.Write(data); err != nil {
46
if err := tmpfile.Close(); err != nil {
49
return tmpfile.Name(), nil
52
// createRandomConfigFiles creates a slice of ReaderSources
53
func createRandomConfigFiles(f *fuzz.ConsumeFuzzer) ([]local.ReaderSource, error) {
54
var files []local.ReaderSource
56
numberOfFiles, err := f.GetInt()
60
maxFiles := numberOfFiles % 10
63
for i := 0; i < maxFiles; i++ {
64
name, err := f.GetString()
68
rBytes, err := f.GetBytes()
72
r := bytes.NewReader(rBytes)
73
files = append(files, local.ReaderSource{Name: name, Reader: r})
78
// runAnalyzer runs the analyzer
79
func runAnalyzer(sa *local.IstiodAnalyzer) (local.AnalysisResult, error) {
80
prevLogLevel := scope.Processing.GetOutputLevel()
81
scope.Processing.SetOutputLevel(log.NoneLevel)
82
defer scope.Processing.SetOutputLevel(prevLogLevel)
84
cancel := make(chan struct{})
85
result, err := sa.Analyze(cancel)
87
return local.AnalysisResult{}, err
92
// FuzzAnalyzer implements the fuzzer
93
func FuzzAnalyzer(data []byte) int {
94
f := fuzz.NewConsumer(data)
95
analyzerIndex, err := f.GetInt()
99
analyzer := availableAnalyzers[analyzerIndex%len(availableAnalyzers)]
101
requestedInputsByAnalyzer := make(map[string]map[config.GroupVersionKind]struct{})
102
analyzerName := analyzer.Metadata().Name
103
cr := func(col config.GroupVersionKind) {
104
if _, ok := requestedInputsByAnalyzer[analyzerName]; !ok {
105
requestedInputsByAnalyzer[analyzerName] = make(map[config.GroupVersionKind]struct{})
107
requestedInputsByAnalyzer[analyzerName][col] = struct{}{}
111
addMeshConfig, err := f.GetBool()
117
meshConfigFile, err = createRandomConfigFile(f)
121
defer os.Remove(meshConfigFile)
124
// Mesh networks file
125
addMeshNetworks, err := f.GetBool()
129
meshNetworkFile := ""
131
meshNetworkFile, err = createRandomConfigFile(f)
135
defer os.Remove(meshNetworkFile)
138
configFiles, err := createRandomConfigFiles(f)
143
sa := local.NewSourceAnalyzer(analysis.Combine("testCase", analyzer), "", "istio-system", cr)
145
err = sa.AddFileKubeMeshConfig(meshConfigFile)
151
err = sa.AddFileKubeMeshNetworks(meshNetworkFile)
157
// Include default resources
158
err = sa.AddDefaultResources()
163
// Include resources from test files
164
err = sa.AddReaderKubeSource(configFiles)
168
_, _ = runAnalyzer(sa)