Itron News
Cybersecurity Threat Reduction Through Vulnerability Research
This blog was originally posted on Comverge.com. Itron acquired Comverge on June 1, 2017, and all future demand response blogs will be posted here.
As I outlined in my first blog post, Comverge's cybersecurity approach is based on a Defense in Depth strategy that includes a security-aware systems development life cycle (SDLC) that promotes threat reduction through vulnerability research.
As part of Comverge's ongoing commitment to ensure the security and integrity of our DirectLink load control switches and smart thermostats and all related sensitive information, Comverge engaged Optiv, the largest comprehensive pure-play cyber security solutions provider in North America, to perform a research assessment of the DirectLink Server. Optiv has served more than 12,000 clients of various sizes across multiple industries, offers an extensive geographic footprint, and has premium partnerships with more than 300 of the leading security product manufacturers.
Optiv researchers worked with Comverge to construct a detailed threat model that enumerated the system's various components, realistic attack vectors, as well as the "threat actors" who may wish to misuse this technology. Optiv researchers and Comverge developers collaborated to derive a testing methodology tailored to DirectLink and the needs of Comverge's customers.
Optiv performed a review of the relevant hardware platforms. These efforts included disassembly and analysis of Comverge's devices as they pertain to the established threat model. Researchers performed a hardware teardown of the devices, analyzed their components.
Optiv researchers also reviewed the source code using automated tools and manual analysis looking for security related vulnerabilities or more general best practice violations. Optiv researchers used debugging hardware and software to analyze a DirectLink system while it was operational. These efforts allowed researchers to search for vulnerabilities that might arise during the product's day-to-day operation. This dynamic analysis is similar to the actions taken by active reverse engineering efforts used in sophisticated attacks against infrastructure.
At the conclusion of the assessment Optiv expressed the opinion that Comverge partners can be assured that we performed proper due diligence by engaging an experienced and trusted third party to independently evaluate our products from an information security standpoint. Finally, our clients can be assured that Comverge is following a best practices approach to continually improve our organizations maturity and meet or exceed industry standards for information security.
As I outlined in my first blog post, Comverge's cybersecurity approach is based on a Defense in Depth strategy that includes a security-aware systems development life cycle (SDLC) that promotes threat reduction through vulnerability research.
As part of Comverge's ongoing commitment to ensure the security and integrity of our DirectLink load control switches and smart thermostats and all related sensitive information, Comverge engaged Optiv, the largest comprehensive pure-play cyber security solutions provider in North America, to perform a research assessment of the DirectLink Server. Optiv has served more than 12,000 clients of various sizes across multiple industries, offers an extensive geographic footprint, and has premium partnerships with more than 300 of the leading security product manufacturers.
Optiv researchers worked with Comverge to construct a detailed threat model that enumerated the system's various components, realistic attack vectors, as well as the "threat actors" who may wish to misuse this technology. Optiv researchers and Comverge developers collaborated to derive a testing methodology tailored to DirectLink and the needs of Comverge's customers.
Optiv performed a review of the relevant hardware platforms. These efforts included disassembly and analysis of Comverge's devices as they pertain to the established threat model. Researchers performed a hardware teardown of the devices, analyzed their components.
Optiv researchers also reviewed the source code using automated tools and manual analysis looking for security related vulnerabilities or more general best practice violations. Optiv researchers used debugging hardware and software to analyze a DirectLink system while it was operational. These efforts allowed researchers to search for vulnerabilities that might arise during the product's day-to-day operation. This dynamic analysis is similar to the actions taken by active reverse engineering efforts used in sophisticated attacks against infrastructure.
At the conclusion of the assessment Optiv expressed the opinion that Comverge partners can be assured that we performed proper due diligence by engaging an experienced and trusted third party to independently evaluate our products from an information security standpoint. Finally, our clients can be assured that Comverge is following a best practices approach to continually improve our organizations maturity and meet or exceed industry standards for information security.
Kesalahan terjadi ketika Memproses Template.
The following has evaluated to null or missing:
==> authorContent.contentFields [in template "44616#44647#114455" at line 9, column 17]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: contentFields = authorContent.content... [in template "44616#44647#114455" at line 9, column 1]
----
1<#assign
2 webContentData = jsonFactoryUtil.createJSONObject(author.getData())
3 classPK = webContentData.classPK
4/>
5
6<#assign
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs")
8contentFields = authorContent.contentFields
9categories=authorContent.taxonomyCategoryBriefs
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent)
11friendlyURL = authorContentData.friendlyUrlPath
12authorCategoryId = "0"
13/>
14
15<#list contentFields as contentField >
16 <#assign
17 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)
18 name = contentField.name
19 />
20 <#if name == 'authorImage'>
21 <#if (contentField.contentFieldValue.image)??>
22 <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />
23 </#if>
24 </#if>
25 <#if name == 'authorName'>
26 <#assign authorName = contentField.contentFieldValue.data />
27 <#list categories as category >
28 <#if authorName == category.taxonomyCategoryName>
29 <#assign authorCategoryId = category.taxonomyCategoryId />
30 </#if>
31 </#list>
32 </#if>
33 <#if name == 'authorDescription'>
34 <#assign authorDescription = contentField.contentFieldValue.data />
35
36 </#if>
37
38 <#if name == 'authorJobTitle'>
39 <#assign authorJobTitle = contentField.contentFieldValue.data />
40
41 </#if>
42
43</#list>
44
45<div class="blog-author-info">
46 <#if authorImageURL??>
47 <img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" />
48 </#if>
49 <#if authorName??>
50 <#if authorName != "">
51 <p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p>
52 <hr />
53 </#if>
54 </#if>
55 <#if authorJobTitle??>
56 <#if authorJobTitle != "">
57 <p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p>
58 <hr />
59 </#if>
60 </#if>
61 <#if authorDescription??>
62 <#if authorDescription != "" && authorDescription != "null" >
63 <p class="blog-author-desc" id="author-job-desc">${authorDescription}</p>
64 <hr />
65 </#if>
66 </#if>
67</div>
The following has evaluated to null or missing: ==> authorContent.contentFields [in template "44616#44647#114455" at line 9, column 17] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: contentFields = authorContent.content... [in template "44616#44647#114455" at line 9, column 1] ----
1<#assign
2 webContentData = jsonFactoryUtil.createJSONObject(author.getData())
3 classPK = webContentData.classPK
4/>
5
6<#assign
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs")
8contentFields = authorContent.contentFields
9categories=authorContent.taxonomyCategoryBriefs
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent)
11friendlyURL = authorContentData.friendlyUrlPath
12authorCategoryId = "0"
13/>
14
15<#list contentFields as contentField >
16 <#assign
17 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)
18 name = contentField.name
19 />
20 <#if name == 'authorImage'>
21 <#if (contentField.contentFieldValue.image)??>
22 <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />
23 </#if>
24 </#if>
25 <#if name == 'authorName'>
26 <#assign authorName = contentField.contentFieldValue.data />
27 <#list categories as category >
28 <#if authorName == category.taxonomyCategoryName>
29 <#assign authorCategoryId = category.taxonomyCategoryId />
30 </#if>
31 </#list>
32 </#if>
33 <#if name == 'authorDescription'>
34 <#assign authorDescription = contentField.contentFieldValue.data />
35
36 </#if>
37
38 <#if name == 'authorJobTitle'>
39 <#assign authorJobTitle = contentField.contentFieldValue.data />
40
41 </#if>
42
43</#list>
44
45<div class="blog-author-info">
46 <#if authorImageURL??>
47 <img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" />
48 </#if>
49 <#if authorName??>
50 <#if authorName != "">
51 <p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p>
52 <hr />
53 </#if>
54 </#if>
55 <#if authorJobTitle??>
56 <#if authorJobTitle != "">
57 <p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p>
58 <hr />
59 </#if>
60 </#if>
61 <#if authorDescription??>
62 <#if authorDescription != "" && authorDescription != "null" >
63 <p class="blog-author-desc" id="author-job-desc">${authorDescription}</p>
64 <hr />
65 </#if>
66 </#if>
67</div>