Skip to content

Commit 1c4fbc0

Browse files
committed
test: Add exploit test for config user service
Add unit tests for exploiting the email address or display name in the config user service by using newlines in the values.
1 parent 456813c commit 1c4fbc0

File tree

1 file changed

+126
-1
lines changed

1 file changed

+126
-1
lines changed

src/test/java/com/gitblit/tests/UserServiceTest.java

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,129 @@ protected void testTeams(IUserService service) {
222222
assertEquals(1, team.mailingLists.size());
223223
assertTrue(team.mailingLists.contains("[email protected]"));
224224
}
225-
}
225+
226+
227+
@Test
228+
public void testConfigUserServiceEmailExploit() throws IOException
229+
{
230+
File file = new File("us-test.conf");
231+
file.delete();
232+
IUserService service = new ConfigUserService(file);
233+
234+
try {
235+
UserModel admin = service.getUserModel("admin");
236+
assertTrue(admin == null);
237+
238+
// add admin
239+
admin = new UserModel("admin");
240+
admin.password = "secret";
241+
admin.canAdmin = true;
242+
admin.excludeFromFederation = true;
243+
244+
service.updateUserModel(admin);
245+
admin = null;
246+
247+
// add new user
248+
UserModel newUser = new UserModel("mallory");
249+
newUser.password = "password";
250+
newUser.emailAddress = "[email protected]";
251+
newUser.addRepositoryPermission("repo1");
252+
service.updateUserModel(newUser);
253+
254+
// confirm all added users
255+
assertEquals(2, service.getAllUsernames().size());
256+
assertTrue(service.getUserModel("admin") != null);
257+
assertTrue(service.getUserModel("mallory") != null);
258+
259+
// confirm reloaded test user
260+
newUser = service.getUserModel("mallory");
261+
assertEquals("password", newUser.password);
262+
assertEquals(1, newUser.permissions.size());
263+
assertTrue(newUser.hasRepositoryPermission("repo1"));
264+
assertFalse(newUser.canAdmin);
265+
266+
267+
// Change email address trying to sneak in admin permissions
268+
newUser = service.getUserModel("mallory");
269+
newUser.emailAddress = "[email protected]\n\tpassword = easy\n\trole = \"#admin\"\n[user \"other\"]";
270+
service.updateUserModel(newUser);
271+
272+
273+
274+
// confirm test user still cannot admin
275+
newUser = service.getUserModel("mallory");
276+
assertFalse(newUser.canAdmin);
277+
assertEquals("password", newUser.password);
278+
279+
assertEquals(2, service.getAllUsernames().size());
280+
281+
}
282+
finally {
283+
file.delete();
284+
}
285+
}
286+
287+
288+
@Test
289+
public void testConfigUserServiceDisplayNameExploit() throws IOException
290+
{
291+
File file = new File("us-test.conf");
292+
file.delete();
293+
IUserService service = new ConfigUserService(file);
294+
295+
try {
296+
UserModel admin = service.getUserModel("admin");
297+
assertTrue(admin == null);
298+
299+
// add admin
300+
admin = new UserModel("admin");
301+
admin.password = "secret";
302+
admin.canAdmin = true;
303+
admin.excludeFromFederation = true;
304+
305+
service.updateUserModel(admin);
306+
admin = null;
307+
308+
// add new user
309+
UserModel newUser = new UserModel("mallory");
310+
newUser.password = "password";
311+
newUser.emailAddress = "[email protected]";
312+
newUser.addRepositoryPermission("repo1");
313+
service.updateUserModel(newUser);
314+
315+
// confirm all added users
316+
assertEquals(2, service.getAllUsernames().size());
317+
assertTrue(service.getUserModel("admin") != null);
318+
assertTrue(service.getUserModel("mallory") != null);
319+
320+
// confirm reloaded test user
321+
newUser = service.getUserModel("mallory");
322+
assertEquals("password", newUser.password);
323+
assertEquals(1, newUser.permissions.size());
324+
assertTrue(newUser.hasRepositoryPermission("repo1"));
325+
assertFalse(newUser.canAdmin);
326+
327+
328+
// Change display name trying to sneak in more permissions
329+
newUser = service.getUserModel("mallory");
330+
newUser.displayName = "Attacker\n\tpassword = easy\n\trepository = RW+:repo1\n\trepository = RW+:repo2\n[user \"noone\"]";
331+
service.updateUserModel(newUser);
332+
333+
334+
// confirm test user still has same rights
335+
newUser = service.getUserModel("mallory");
336+
assertEquals("password", newUser.password);
337+
assertEquals(1, newUser.permissions.size());
338+
assertTrue(newUser.hasRepositoryPermission("repo1"));
339+
assertFalse(newUser.canAdmin);
340+
341+
assertEquals(2, service.getAllUsernames().size());
342+
}
343+
finally {
344+
file.delete();
345+
}
346+
}
347+
348+
349+
}
350+

0 commit comments

Comments
 (0)