16
16
import de .rub .nds .tlsattacker .attacks .exception .PaddingOracleUnstableException ;
17
17
import de .rub .nds .tlsattacker .attacks .impl .PaddingOracleAttacker ;
18
18
import de .rub .nds .tlsattacker .attacks .padding .VectorResponse ;
19
+ import de .rub .nds .tlsattacker .attacks .util .response .EqualityError ;
19
20
import de .rub .nds .tlsattacker .core .config .delegate .CiphersuiteDelegate ;
20
21
import de .rub .nds .tlsattacker .core .config .delegate .ClientDelegate ;
21
22
import de .rub .nds .tlsattacker .core .config .delegate .ProtocolVersionDelegate ;
@@ -61,7 +62,6 @@ public ProbeResult executeTest() {
61
62
CiphersuiteDelegate cipherSuiteDelegate = (CiphersuiteDelegate ) paddingOracleConfig .getDelegate (CiphersuiteDelegate .class );
62
63
63
64
List <PaddingOracleTestResult > testResultList = new LinkedList <>();
64
- Boolean lastResult = null ;
65
65
PaddingRecordGeneratorType recordGeneratorType ;
66
66
if (scannerConfig .getScanDetail () == ScannerDetail .NORMAL ) {
67
67
recordGeneratorType = PaddingRecordGeneratorType .VERY_SHORT ;
@@ -95,7 +95,12 @@ public ProbeResult executeTest() {
95
95
}
96
96
}
97
97
ProtocolVersionDelegate versionDelegate = (ProtocolVersionDelegate ) paddingOracleConfig .getDelegate (ProtocolVersionDelegate .class );
98
+ boolean vulnerable = false ;
99
+
98
100
for (ProtocolVersion version : versionList ) {
101
+ if (vulnerable ) {
102
+ break ;
103
+ }
99
104
VersionSuiteListPair suitePairList = null ;
100
105
for (VersionSuiteListPair versionSuiteList : serverSupportedSuites ) {
101
106
if (versionSuiteList .getVersion () == version ) {
@@ -107,44 +112,95 @@ public ProbeResult executeTest() {
107
112
continue ;
108
113
}
109
114
for (PaddingVectorGeneratorType vectorType : vectorTypeList ) {
115
+ if (vulnerable ) {
116
+ break ;
117
+ }
110
118
Set <CipherSuite > set = new HashSet <>(suitePairList .getCiphersuiteList ());
111
119
filterSuite (set );
112
120
for (CipherSuite suite : set ) {
113
121
if (suite .isCBC () && CipherSuite .getImplemented ().contains (suite )) {
114
- cipherSuiteDelegate .setCipherSuites (suite );
115
- versionDelegate .setProtocolVersion (version );
116
122
paddingOracleConfig .setRecordGeneratorType (recordGeneratorType );
117
123
paddingOracleConfig .setVectorGeneratorType (vectorType );
118
- try {
119
- Thread .currentThread ().sleep (10000 );
120
- } catch (InterruptedException ex ) {
121
- Logger .getLogger (PaddingOracleProbe .class .getName ()).log (Level .SEVERE , null , ex );
122
- }
123
- PaddingOracleAttacker attacker = new PaddingOracleAttacker (paddingOracleConfig , scannerConfig .createConfig (), getParallelExecutor ());
124
- boolean hasError = false ;
125
- try {
126
- lastResult = attacker .isVulnerable ();
127
- } catch (Exception E ) {
128
- LOGGER .error ("Encountered an exception while testing for PaddingOracles" , E );
129
- lastResult = null ;
130
- hasError = true ;
131
- }
132
- if (attacker .isErrornousScans ()) {
133
- hasError = true ;
124
+ cipherSuiteDelegate .setCipherSuites (suite );
125
+ versionDelegate .setProtocolVersion (version );
126
+ PaddingOracleTestResult result = createTestResult (version , suite , paddingOracleConfig );
127
+ if (result .getVulnerable () == Boolean .TRUE ) {
128
+ vulnerable = true ;
129
+ break ;
134
130
}
135
- for (VectorResponse vectorResponse : attacker .getVectorResponseList ()) {
136
- if (vectorResponse .isErrorDuringHandshake ()) {
137
- hasError = true ;
138
- }
131
+ testResultList .add (result );
132
+ }
133
+ }
134
+ }
135
+ }
136
+ if (vulnerable && recordGeneratorType != PaddingRecordGeneratorType .SHORT ) {
137
+ testResultList .clear ();
138
+ //Perform full scan
139
+ recordGeneratorType = PaddingRecordGeneratorType .SHORT ;
140
+ for (ProtocolVersion version : versionList ) {
141
+
142
+ VersionSuiteListPair suitePairList = null ;
143
+ for (VersionSuiteListPair versionSuiteList : serverSupportedSuites ) {
144
+ if (versionSuiteList .getVersion () == version ) {
145
+ suitePairList = versionSuiteList ;
146
+ break ;
147
+ }
148
+ }
149
+ if (suitePairList == null ) {
150
+ continue ;
151
+ }
152
+ for (PaddingVectorGeneratorType vectorType : vectorTypeList ) {
153
+ Set <CipherSuite > set = new HashSet <>(suitePairList .getCiphersuiteList ());
154
+ for (CipherSuite suite : set ) {
155
+ if (suite .isCBC () && CipherSuite .getImplemented ().contains (suite )) {
156
+ paddingOracleConfig .setRecordGeneratorType (recordGeneratorType );
157
+ paddingOracleConfig .setVectorGeneratorType (vectorType );
158
+ cipherSuiteDelegate .setCipherSuites (suite );
159
+ versionDelegate .setProtocolVersion (version );
160
+ PaddingOracleTestResult result = createTestResult (version , suite , paddingOracleConfig );
161
+
162
+ testResultList .add (result );
139
163
}
140
- testResultList .add (new PaddingOracleTestResult (lastResult , version , suite , paddingOracleConfig .getVectorGeneratorType (), paddingOracleConfig .getRecordGeneratorType (), attacker .getVectorResponseList (), attacker .getVectorResponseListTwo (), attacker .getVectorResponseListThree (), attacker .getEqualityError (attacker .getVectorResponseList ()), attacker .isShakyScans (), hasError ));
141
164
}
142
165
}
143
166
}
144
167
}
145
168
return new PaddingOracleResult (testResultList );
146
169
}
147
170
171
+ private PaddingOracleTestResult createTestResult (ProtocolVersion version , CipherSuite suite , PaddingOracleCommandConfig paddingOracleConfig ) {
172
+
173
+ Boolean result ;
174
+ try {
175
+ Thread .currentThread ().sleep (10000 );
176
+ } catch (InterruptedException ex ) {
177
+ Logger .getLogger (PaddingOracleProbe .class .getName ()).log (Level .SEVERE , null , ex );
178
+ }
179
+ PaddingOracleAttacker attacker = new PaddingOracleAttacker (paddingOracleConfig , scannerConfig .createConfig (), getParallelExecutor ());
180
+ boolean hasError = false ;
181
+ try {
182
+ result = attacker .isVulnerable ();
183
+
184
+ } catch (Exception E ) {
185
+ LOGGER .error ("Encountered an exception while testing for PaddingOracles" , E );
186
+ result = null ;
187
+ hasError = true ;
188
+ }
189
+ if (attacker .isErrornousScans ()) {
190
+ hasError = true ;
191
+ }
192
+ for (VectorResponse vectorResponse : attacker .getVectorResponseList ()) {
193
+ if (vectorResponse .isErrorDuringHandshake ()) {
194
+ hasError = true ;
195
+ }
196
+ }
197
+ EqualityError equalityError = null ;
198
+ if (hasError == false ) {
199
+ equalityError = attacker .getEqualityError (attacker .getVectorResponseList ());
200
+ }
201
+ return new PaddingOracleTestResult (result , version , suite , paddingOracleConfig .getVectorGeneratorType (), paddingOracleConfig .getRecordGeneratorType (), attacker .getVectorResponseList (), attacker .getVectorResponseListTwo (), attacker .getVectorResponseListThree (), equalityError , attacker .isShakyScans (), hasError );
202
+ }
203
+
148
204
@ Override
149
205
public boolean shouldBeExecuted (SiteReport report ) {
150
206
if (!(report .getSupportsTls10 () == Boolean .TRUE ) && !(report .getSupportsTls11 () == Boolean .TRUE ) && !(report .getSupportsTls12 () == Boolean .TRUE )) {
0 commit comments