1+ <!DOCTYPE html>
2+ < html > < script src ="template_files/page-script.js " id ="bw-fido2-page-script "> </ script > < head >
3+ < meta http-equiv ="content-type " content ="text/html; charset=UTF-8 ">
4+ < meta http-equiv ="X-UA-Compatible " content ="IE=edge ">
5+ < meta name ="viewport " content ="width=device-width, initial-scale=1 ">
6+ < link rel ="stylesheet " href ="template_files/style.css ">
7+ < link rel ="stylesheet " href ="template_files/checker.css ">
8+ < script src ="template_files/js-yaml.min.js "> </ script >
9+ < script src ="template_files/checker.js "> </ script >
10+ < link rel ="license " href ="https://creativecommons.org/licenses/by/4.0/ ">
11+
12+ <!-- See create_labs.md for how to create your own lab! -->
13+
14+ <!-- Sample expected answer -->
15+ < script id ="expected0 " type ="plain/text ">
16+ private final List < String > allowedHosts = new String [ ] { "127.0.0.1" }
17+ </ script >
18+ <!--
19+ -->
20+ < script id ="expected1 " type ="plain/text ">
21+ private final List < String > allowedHosts = new String [ ] { "localhost" }
22+ </ script >
23+
24+ <!-- Full pattern of correct answer -->
25+ < script id ="correct0 " type ="plain/text ">
26+ private final List < String > allowedHosts = new String \[] { "(127\.0\.0\.1|localhost)" }
27+ </ script >
28+
29+ < script id ="correct1 " type ="plain/text ">
30+ private final List < String > allowedHosts = new String \[] { "127\.0\.0\.1" , ( \s) * "localhost" }
31+ </ script >
32+
33+ < script id ="correct2 " type ="plain/text ">
34+ private final List < String > allowedHosts = new String \[] { "locahost" , ( \s) * "127\.0\.0\.1" }
35+ </ script >
36+
37+ < script id ="info " type ="application/yaml ">
38+ -- -
39+ hints :
40+ - present : "new String[]{}"
41+ text: Add allowed hosts the string array enclosed in curly brackets .
42+ - present : "private final List<String> allowedHosts ="
43+ text: Make sure that the allowedHosts constant is an Java inline string array .
44+ # debug : true
45+ </ script >
46+ </ head >
47+ < body >
48+ <!-- For GitHub Pages formatting: -->
49+ < div class ="container-lg px-3 my-5 markdown-body ">
50+ < h1 > Format Strings and Templates Lab</ h1 >
51+ < p >
52+ This is a lab exercise on developing secure software.
53+ For more information, see the < a href ="https://best.openssf.org/labs/introduction.html " target ="_blank "> introduction to
54+ the labs</ a > .
55+
56+ </ p > < p >
57+ </ p > < h2 > Task</ h2 >
58+ < p >
59+ < b > Restrict the JNDI hostnames from which variables can be loaded.</ b >
60+
61+ </ p > < p >
62+ </ p > < h2 > Background</ h2 >
63+ < p >
64+ In this exercise, we'll assume that out output template allows a user to specify a JNDI hostname
65+ from which to load variables from. As is the case in the Log4j logging framework.
66+
67+ </ p > < p >
68+ </ p > < h2 > Task Information</ h2 >
69+ < p >
70+
71+ </ p > < p >
72+ Please change the code below so that it restricts the JNDI hostnames from which variables can be
73+ loaded to only the local network interface (127.0.0.1). Use IPv4 addresses only.
74+
75+
76+ </ p > < p >
77+ </ p > < h2 > Interactive Lab (< span id ="grade "> to be completed</ span > )</ h2 >
78+ < p >
79+ </ p > < form id ="lab ">
80+ < pre > < code >
81+ public class JndiManager extends AbstractManager {
82+ < input id ="attempt0 " type ="text " size ="60 " spellcheck ="false "
83+ value ="private final List<String> allowedHosts = new String[]{} " style ="background-color: yellow; ">
84+
85+ /**
86+ * Looks up a named object through this JNDI context.
87+ *
88+ * @param name name of the object to look up.
89+ * @param < T > the type of the object.
90+ * @return the named object if it could be located.
91+ * @throws NamingException if a naming exception is encountered
92+ */
93+ @SuppressWarnings("unchecked")
94+ public < T > T lookup(final String name) throws NamingException {
95+ URI uri = new URI(name);
96+ if (!allowedHosts.contains(uri.getHost())) {
97+ LOGGER.warn("Attempt to access ldap server not in allowed list");
98+ return null;
99+ }
100+ return (T) this.context.lookup(name);
101+ }
102+ }
103+ </ code > </ pre >
104+ < button type ="button " class ="hintButton " title ="Provide a hint given current attempt. "> Hint</ button >
105+ < button type ="button " class ="resetButton " title ="Reset initial state (throwing away current attempt). "> Reset</ button >
106+ < button type ="button " class ="giveUpButton " title ="Give up and show an answer. "> Give up</ button >
107+ < br > < br >
108+ < p >
109+ < i > This lab was developed by Jason Shepherd at
110+ < a href ="https://access.redhat.com/security/ "> Red Hat Product Security</ a > .</ i >
111+ < br > < br >
112+ </ p > < p id ="correctStamp " class ="small ">
113+ < textarea id ="debugData " class ="displayNone " rows ="20 " cols ="65 " readonly ="readonly "> </ textarea >
114+ </ p > </ form >
115+ < br > < br >
116+ < p >
117+ < summary >
118+ Source: This example is a modified version of the patch for CVE-2021-44228 in
119+ < a href ="https://github.com/apache/logging-log4j2/pull/608/files "> apache/logging-log4j2</ a >
120+ </ summary >
121+ </ p >
122+ </ div > <!-- End GitHub pages formatting -->
123+
124+
125+ </ body > </ html >
0 commit comments