Skip to content

Commit 63a7744

Browse files
bakitodaniel-beck
authored andcommitted
[SECURITY-906]
1 parent 0d6308f commit 63a7744

File tree

5 files changed

+63
-5
lines changed

5 files changed

+63
-5
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@
112112
<version>1.39</version>
113113
</dependency>
114114

115+
<dependency>
116+
<groupId>org.jenkins-ci.plugins</groupId>
117+
<artifactId>antisamy-markup-formatter</artifactId>
118+
<version>1.5</version>
119+
</dependency>
115120
<dependency>
116121
<groupId>org.jenkins-ci.plugins.workflow</groupId>
117122
<artifactId>workflow-cps</artifactId>

src/main/java/com/jenkinsci/plugins/badge/action/BadgeSummaryAction.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,21 @@
2323
*/
2424
package com.jenkinsci.plugins.badge.action;
2525

26+
import hudson.markup.RawHtmlMarkupFormatter;
2627
import org.apache.commons.lang.StringEscapeUtils;
2728
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.Whitelisted;
2829
import org.kohsuke.stapler.export.Exported;
2930
import org.kohsuke.stapler.export.ExportedBean;
3031

32+
import java.io.IOException;
33+
import java.util.logging.Level;
34+
import java.util.logging.Logger;
35+
36+
3137
@ExportedBean(defaultVisibility = 2)
3238
public class BadgeSummaryAction extends AbstractAction {
3339
private static final long serialVersionUID = 1L;
40+
private static final Logger LOGGER = Logger.getLogger(BadgeSummaryAction.class.getName());
3441

3542
private final String iconPath;
3643
private String summaryText = "";
@@ -57,9 +64,18 @@ public String getIconPath() {
5764
return iconPath;
5865
}
5966

67+
public String getRawText() {
68+
return summaryText;
69+
}
70+
6071
@Exported
6172
public String getText() {
62-
return summaryText;
73+
try {
74+
return new RawHtmlMarkupFormatter(false).translate(summaryText);
75+
} catch (IOException e) {
76+
LOGGER.log(Level.WARNING, "Error preparing summary text for ui", e);
77+
return "<b><font color=\"red\">ERROR</font></b>";
78+
}
6379
}
6480

6581
@Whitelisted

src/main/java/com/jenkinsci/plugins/badge/action/HtmlBadgeAction.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,19 @@
2323
*/
2424
package com.jenkinsci.plugins.badge.action;
2525

26+
import hudson.markup.RawHtmlMarkupFormatter;
2627
import org.kohsuke.stapler.export.Exported;
2728
import org.kohsuke.stapler.export.ExportedBean;
2829

30+
import java.io.IOException;
31+
import java.util.logging.Level;
32+
import java.util.logging.Logger;
33+
2934
@ExportedBean(defaultVisibility = 2)
3035
public class HtmlBadgeAction extends AbstractBadgeAction {
3136
private static final long serialVersionUID = 1L;
37+
private static final Logger LOGGER = Logger.getLogger(BadgeSummaryAction.class.getName());
38+
3239
private final String html;
3340

3441
private HtmlBadgeAction(String html) {
@@ -52,9 +59,17 @@ public String getIconFileName() {
5259
return null;
5360
}
5461

55-
@Exported
56-
public String getHtml() {
62+
public String getRawHtml() {
5763
return html;
5864
}
5965

66+
@Exported
67+
public String getHtml() {
68+
try {
69+
return new RawHtmlMarkupFormatter(false).translate(html);
70+
} catch (IOException e) {
71+
LOGGER.log(Level.WARNING, "Error preparing html content for ui", e);
72+
return "<b><font color=\"red\">ERROR</font></b>";
73+
}
74+
}
6075
}

src/test/java/com/jenkinsci/plugins/badge/dsl/AddHtmlBadgeStepTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ public class AddHtmlBadgeStepTest extends AbstractBadgeTest {
4040
@Test
4141
public void addHtmlBadge() throws Exception {
4242
String html = UUID.randomUUID().toString();
43+
testAddHtmlBadge(html, html);
44+
}
45+
46+
@Test
47+
public void addHtmlBadge_remove_script() throws Exception {
48+
String uuid = UUID.randomUUID().toString();
49+
String html = uuid + "<script>alert('exploit!');</script>";
50+
testAddHtmlBadge(html, uuid);
51+
}
52+
53+
54+
private void testAddHtmlBadge(String html, String expected) throws Exception {
4355
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p");
4456

4557
String script = "addHtmlBadge(\"" + html + "\")";
@@ -51,6 +63,7 @@ public void addHtmlBadge() throws Exception {
5163
assertEquals(1, badgeActions.size());
5264

5365
HtmlBadgeAction action = (HtmlBadgeAction) badgeActions.get(0);
54-
assertEquals(html, action.getHtml());
66+
assertEquals(expected, action.getHtml());
67+
assertEquals(html, action.getRawHtml());
5568
}
5669
}

src/test/java/com/jenkinsci/plugins/badge/dsl/CreateSummaryStepTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ public void createSummary_html_unescaped() throws Exception {
5151
assertEquals("<li>" + text + "</li>", action.getText());
5252
}
5353

54+
@Test
55+
public void createSummary_html_unescaped_remove_script() throws Exception {
56+
String text = randomUUID().toString();
57+
String html = "<li>" + text + "</li><script>alert(\"exploit!\");</script>";
58+
BadgeSummaryAction action = createSummary("summary.appendText('" + html + "', false);");
59+
assertEquals("<li>" + text + "</li>", action.getText());
60+
assertEquals(html, action.getRawText());
61+
}
62+
5463
@Test
5564
public void createSummary_html_escaped() throws Exception {
5665
String text = randomUUID().toString();
@@ -85,7 +94,7 @@ public void createSummary_with_text() throws Exception {
8594
String text = randomUUID().toString();
8695

8796
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p");
88-
p.setDefinition(new CpsFlowDefinition("def summary = createSummary(icon:\"" + icon + "\", text:\""+text+"\")", true));
97+
p.setDefinition(new CpsFlowDefinition("def summary = createSummary(icon:\"" + icon + "\", text:\"" + text + "\")", true));
8998
WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0));
9099
List<BadgeSummaryAction> summaryActions = b.getActions(BadgeSummaryAction.class);
91100
assertEquals(1, summaryActions.size());

0 commit comments

Comments
 (0)