<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>On the road to Bandol &#187; static analysis</title>
	<atom:link href="https://javacard.vetilles.com/tag/static-analysis/feed/" rel="self" type="application/rss+xml" />
	<link>https://javacard.vetilles.com</link>
	<description>A weblog on Java Card, security, and other things personal</description>
	<lastBuildDate>Mon, 18 Aug 2025 06:48:26 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.32</generator>
	<item>
		<title>The misuse of bytecode verification</title>
		<link>https://javacard.vetilles.com/2011/10/19/the-misuse-of-bytecode-verification/</link>
		<comments>https://javacard.vetilles.com/2011/10/19/the-misuse-of-bytecode-verification/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 08:42:21 +0000</pubDate>
		<dc:creator><![CDATA[Eric Vétillard]]></dc:creator>
				<category><![CDATA[Discussions]]></category>
		<category><![CDATA[Java Card 2.x]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Virtual machine]]></category>
		<category><![CDATA[bytecode]]></category>
		<category><![CDATA[GlobalPlatform]]></category>
		<category><![CDATA[static analysis]]></category>

		<guid isPermaLink="false">http://javacard.vetilles.com/?p=759</guid>
		<description><![CDATA[Bytecode verification has been an interesting debate since the very beginning of Java Card. Back then, in 1997, Java was very much about Java applets, and the bytecode verifier was the essential piece of software that allowed untrusted code to run in a browser efficiently (i.e., without doing expensive runtime checks, and without having to [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bytecode verification has been an interesting debate since the very beginning of Java Card. Back then, in 1997, Java was very much about Java applets, and the bytecode verifier was the essential piece of software that allowed untrusted code to run in a browser efficiently (<em>i.e.</em>, without doing expensive runtime checks, and without having to setup a complex process of applet vetting). We inherited this view of bytecode verification in Java Card, and the verifier was integrated in the Java Card virtual machine.</p>
<p>Since then, there have been many debates about bytecode verification, and my own position has evolved over the years. Today, my opinion is a bit contrasted, some may even say contradictory. Nevertheless, here it is:</p>
<ul>
<li>Bytecode verification has limited use for Java Card runtime security.</li>
<li>Extended bytecode verification is a very good tool for application vetting.</li>
</ul>
<p>Let me give a few more details about these two opinions.</p>
<h4>Bytecode verification and runtime security</h4>
<p>The idea of runtime verification is that it is performed after getting the code, and right before to run it. The code that runs is therefore known correct, at least regarding bytecode execution (unrelated attacks remain possible, of course).</p>
<p>The first big issue with bytecode verification is that, in Java Card, with the split virtual machine model, verification is not performed on the card, but outside of the card, before/during/after converting the application into Java Card&#8217;s specific binary format (CAP file). Then, the application is sent to the card over some channel that may be attacked. Here, we rely on GlobalPlatform&#8217;s cryptography-based security to protect the integrity of the code. So, basically, we still need to establish trust, and we must say goodbye to the power of running untrusted code from arbitrary developers.</p>
<p>This is not a big issue in practice, because there is no business model that allows arbitrary code to be loaded on cards. However, this causes an organizational problem, as the verification process needs to be well organized. Researchers from Nijmegen and Limoges have shown that it is possible to fool the verification process with fake export files, and then load on a card verified code that will perform type confusion attacks.</p>
<p>Going beyond that, some people have designed applications that can be verified, but have been designed to be attacked through hardware attacks (fault induction, usually). Such attacks, usually known as hybrid attacks, completely fool the bytecode verification process.</p>
<p>Most security experts will then remind you at this point of the discussion that bytecode verification is only one part of the process, that GlobalPlatform is also important, that the origin of code is usually known, that this makes it very difficult to include attack code in an application, <em>etc</em>. By doing this, they are just about accepting the fact that bytecode verification is useless or at best  marginally useful: the real security of cards is in the trust between issuers and application providers, and some cryptographic process. Basically, this works because the ecosystems are small enough to be controlled (which is true for cards, and fine for me).</p>
<p>Finally, some vendors claim to have developed defensive virtual machines, which do not require a bytecode verifier, and perform enough runtime verifications to accept any bytecode, good or bad, without any risk. In that case, bytecode verification is really useless, and I believe that it makes things much simpler. Of course, such virtual machines are difficult to design and implement efficiently, but this is definitely possible, and I think that it has been done in the past (or at least that some people has come very close to it).</p>
<p>To conclude, I will get back many years ago. In 2000, Trusted Logic was very proud of its on-card bytecode verifier; the technology worked, but it has not been widely adopted. I believe that the first factor was performance, as verification made the loading and linking process much slower. I also believe that a second factor, less obvious, is that on-card bytecode verification makes the card&#8217;s security more brittle, by encouraging VM developers to rely too much on static verification rather than runtime checks (which also prevent other runtime attacks, for instance using fault induction). More than ten years later, most people admit that this was not the way to go, and I just go one step further by stating that bytecode verification is not that useful for runtime security.</p>
<h4>Bytecode verification and application vetting</h4>
<p>Bytecode verification simply consists of a very simple static analysis of the application code. Basically, this is is a program proof, but a very simple one, whose complexity can be controlled. The objective of such simple proofs is not to demonstrate that a program is correct with respect to its specification, but that this program obeys a predefined set of properties.</p>
<p>For Java bytecode verification, these properties are related to the proper ues of the bytecode instructions. However, the same algorithms can be extended in order to prove many more properties, covering many aspects of application security. Among the things that can be proven, we have the following:</p>
<ul>
<li>Method <em>M</em> is not called.</li>
<li>Method <em>M</em> is not called with arguments <em>A1</em>, &#8230;, <em>An</em>.</li>
<li>Method <em>M</em> is always called before/after method <em>N</em>.</li>
<li>Method <em>M</em> never throws a <code>NullPointerException</code> (or any other exception).</li>
<li>Command <em>INS</em> can only return status codes <em>SW1</em>, &#8230;, <em>SWn</em></li>
<li>Toolkit buffers are only used when they are available.</li>
<li>and many more.</li>
</ul>
<p>Of course, there is no magic. When extending static analysis to many properties, it becomes more and more difficult to avoid false positives, <em>i.e.</em> errors that are caused by weaknesses in the algorithms. Put simply, an application is rejected although it is in fact correct.</p>
<p>Apart from working on the algorithms to make them better, there are two ways to deal with this issue:</p>
<ul>
<li>Providing the verification tool to developers, together with explanations about the rules to follow. Usually, it is rather simple for developers to ensure that their application can be verified, provided that they can use the tool throughout the development process.</li>
<li>Use the tool in a vetting process as a guide for evaluators, who then perform additional verifications. In that case, broken rules are considered as warnings, and then verified by the evaluators. Simple applications can usually be verified easily, and more complex verification requires a few checks, simplified by the fact that the most boring tasks are performed automatically.</li>
</ul>
<p>I believe in both approaches, but the second one has been proven efficient by my then colleagues of Trusted Labs. By using such a static analysis tool, they are able to optimize the vetting process of Java Card applications (and MIDlets, but this is another story) significantly, by allowing them to focus on the the most important parts of the applications.</p>
<p>In addition, this approach allows us to include many more security rules. For instance, hybrid applications must include code that can be modified into attack code through a simple attack. It is possible to build a library of patterns of such code sequences, and to check for them statically. Then, evaluators can be warned of the possible presence of an hybrid attack and check for it. This can be promising, because such checks (very boring to do, but very unlikely to lead to anything) are usually poorly performed by humans.</p>
<p>Finally, extended bytecode verification, or static analysis, has been proven to be a very efficient optimization tool. All optimizing compilers include a static analysis phase to perform their most complex optimizations. Java Card can take great advantage of this, because of the isolation between applications, and also because of the closed world hypothesis that is sometimes possible, when cards are closed (no additional applications can be downloaded).</p>
<p>So, bytecode verification has many uses in Java Card, but runtime security just isn&#8217;t the most compelling.</p>
]]></content:encoded>
			<wfw:commentRss>https://javacard.vetilles.com/2011/10/19/the-misuse-of-bytecode-verification/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Last Day at Trusted Logic</title>
		<link>https://javacard.vetilles.com/2011/09/30/my-last-day-at-trusted-logic/</link>
		<comments>https://javacard.vetilles.com/2011/09/30/my-last-day-at-trusted-logic/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 19:33:47 +0000</pubDate>
		<dc:creator><![CDATA[Eric Vétillard]]></dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[static analysis]]></category>
		<category><![CDATA[Trusted Logic]]></category>

		<guid isPermaLink="false">http://javacard.vetilles.com/?p=739</guid>
		<description><![CDATA[Today is my last day at Trusted Logic, after a bit more than 11 years. It has been a great adventure, and I really enjoyed the small company feeling, where one has to deal with one thousand different activities, giving many opportunities to learn on different fields. As I try to think about successes and [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Today is my last day at Trusted Logic, after a bit more than 11 years. It has been a great adventure, and I really enjoyed the small company feeling, where one has to deal with one thousand different activities, giving many opportunities to learn on different fields.</p>
<p>As I try to think about successes and frustrations, it is quite funny to realize that the topics that make me the proudest are also the ones that bring the most frustration, because of this feeling that we could have done so much more.</p>
<ul>
<li><strong>The multi-application card ecosystem</strong>. When I joined Trusted Logic in 2000, 3 years after Java Card 2.0, I thought that the deployment of multi-application cards was imminent. I wa right for the cards, but the applications didnâ€™t really come. 11 years later, we are still hoping; this time, we are looking at NFC as the technology that will bring real multi-provider multi-application cards later.</li>
<li><strong>Static analysis</strong>. That part remains my lifeline, from my Ph.D. thesis to some work today. The work we did was technically really good, but it fell as a victim of the problem above: the Java Card developer community is too small for tool vendors. The tool is still around, helping Trusted Labs evaluators in their daily jobs.</li>
</ul>
<p>But more than all this, these 11 years have been a great human adventure, with many wonderful colleagues. Some of them are already gone, some are still in Trusted Logic or Gemalto, but they are the main factor that made me stay so long in the same company. Dear colleagues, I wish you all the best for the future, and I hope that weâ€™ll have more opportunities to work or play together.</p>
<p>I will be taking a few weeks off before to start on a new job, taking the opportunity to get some family time, and hopefully to keep working on the Java Card tutorial, and posting a few things here.</p>
<p>See yaâ€™ll later.</p>
]]></content:encoded>
			<wfw:commentRss>https://javacard.vetilles.com/2011/09/30/my-last-day-at-trusted-logic/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Android Malware, Permissions, and Side Channels</title>
		<link>https://javacard.vetilles.com/2011/01/29/android-malware-permissions-and-side-channels/</link>
		<comments>https://javacard.vetilles.com/2011/01/29/android-malware-permissions-and-side-channels/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 21:57:55 +0000</pubDate>
		<dc:creator><![CDATA[Eric Vétillard]]></dc:creator>
				<category><![CDATA[Discussions]]></category>
		<category><![CDATA[Mobile Security]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[malware]]></category>
		<category><![CDATA[static analysis]]></category>

		<guid isPermaLink="false">http://javacard.vetilles.com/?p=694</guid>
		<description><![CDATA[New Android malware keeps popping up, and the latest one to be publicly discussed is very typical of what we are seeing these days. And frankly, I haven&#8217;t found them very impressive. In short, the attack consists in recording phone calls, identifying calls to credit card support lines, then analyzing the recording to identify the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>New Android malware keeps popping up, and the latest one to be <a href="http://www.schneier.com/blog/archives/2011/01/trojan_steals_c.html" class="liexternal">publicly</a> <a href="http://www.thinq.co.uk/2011/1/20/android-trojan-captures-credit-card-details/" class="liexternal">discussed </a>is very typical of what we are seeing these days. And frankly, I haven&#8217;t found them very impressive. In short, the attack consists in recording phone calls, identifying calls to credit card support lines, then analyzing the recording to identify the tones corresponding to a credit card number, and finally transmitting this data to another piece of malware through hardware settings.</p>
<p>Basically, this attack shares the following characteristics with many other ones:</p>
<ul>
<li><strong>Exploit Android permissions</strong>. Android permissions are very wide, and labeled in simple terms. This means that there are many ways to abuse people, especially with combinations. In that particular case, the use of two collaborating applications is a way to hide combinations, but it also makes the attack more difficult.</li>
<li>Use a side channel for leaking data. Some side channels are obvious (like leaking data on Internet together with other data), and this one is trickier. In fact, there is always a tricky way to leak data, especially when you can do it one bit at a time.</li>
<li>Be a proof-of-concept. This malware works, but only in a lab. In the real world, it needs someone to download two pieces of malware, dial a credit card support hotline, type a credit card number, and do that for another reason then blocking the card. Possible, quite unlikely.</li>
</ul>
<p>My main claim is that such a malware is quite unlikely to represent any kind of danger. The scheme is so complex that by the time people get credit card numbers stolen, the malware is very likely to be detected. My second claim is that the Android permission system is not worse than the others around: iOS doesn&#8217;t really use permissions, MIDP uses overly detailed ones (granted by network operators in most cases), <em>etc</em>. My third claim is that what really count is that the Android Market is able to vet applications; even if it doesn&#8217;t do much today, we can rest assured that Google will make sure that 2011 doesn&#8217;t become <a href="http://javacard.vetilles.com/2011/01/20/2011-the-year-of-mobile-malware-nope/" class="liinternal">the year of mobile malware</a>.</p>
<p>Nevertheless, the paper points a few interesting things about Android permissions, and some of them could be fixed:</p>
<ul>
<li>The <em>Read contact data</em> permission gives access to the call history. I am not sure that I see the need for that. In fact, my main issue with that is that, in terms of privacy control, I believe that it&#8217;s very different to know who I know and who I actually call. I believe that this one should be fixed.</li>
<li>The <em>Record audio</em> permission allows an application to record the content of phone communication (as well as recording audio in the background, actually). In fact, that&#8217;s again a privacy issue: an application that records audio while it is the currently running application is fine; allowing that application to record audio from the background is a very different thing, which worries me. This one also deserves to be fixed.</li>
<li>The side channel actually doesn&#8217;t use any permission in most cases, since it uses channels that don&#8217;t require any, like setting the volume repeatedly. Here, I don&#8217;t think that there is a big problem, because getting data out is most likely not the main problem today. Five years ago, everybody was worried about connected applications; today, most people consider it normal for an application to be somehow connected to the net (for instance, an application can always claim to backup things, to have a social side, <em>etc</em>.). Malware doesn&#8217;t need to be bundled with sensitive, intelligent software, so complicated side channels probably represent a futile complexity.</li>
</ul>
<p>To conclude, a word about hidden communication channels. I have worked on information flow static analysis, and we haven&#8217;t found many practical ways to identify hiddne information flows. Usually, these hidden flows do not use variables or communication APIs to leak data. Instead, they often leak a trickle of information using either an unnecesssarily convoluted computation (which is likely to attract the attention of a human reviewer, but is difficult to find for a static analyzer), or by looping on an apparently innocuous API method (this is what is done here, and we may have detected it using a static analyzer).</p>
]]></content:encoded>
			<wfw:commentRss>https://javacard.vetilles.com/2011/01/29/android-malware-permissions-and-side-channels/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2011: The year of mobile malware? Nope.</title>
		<link>https://javacard.vetilles.com/2011/01/20/2011-the-year-of-mobile-malware-nope/</link>
		<comments>https://javacard.vetilles.com/2011/01/20/2011-the-year-of-mobile-malware-nope/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 17:01:52 +0000</pubDate>
		<dc:creator><![CDATA[Eric Vétillard]]></dc:creator>
				<category><![CDATA[IdÃ©es reÃ§ues]]></category>
		<category><![CDATA[Mobile Security]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[static analysis]]></category>

		<guid isPermaLink="false">http://javacard.vetilles.com/?p=683</guid>
		<description><![CDATA[One of the discussion topics at this week&#8217;s Mobile Security Barcamp in Sophia Antipolis was mobile malware, with some people claiming that 2011 will be the year of mobile malware. I agree with them that, as mobile takes more and more power, and as platforms like iOS and Android become more and more common, they [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>One of the discussion topics at this week&#8217;s Mobile Security Barcamp in Sophia Antipolis was mobile malware, with some people claiming that 2011 will be the year of mobile malware. I agree with them that, as mobile takes more and more power, and as platforms like iOS and Android become more and more common, they become a prime target for malware developers. So yes, more mobile malware will be produced.</p>
<p>However, naming 2011 &#8220;The Year of Mobile Malware&#8221; also entails that this malware will have a real effect on users, and that &#8216;s where I am much less sure. The main reason for this doubt comes from the use of application stores as the dominant way to deploy applications. The fact that most mobile applications go through the same few filters (Apple&#8217;s App Store, Google&#8217;s Android Market, and a few more) is of great help against malware, for several reasons:</p>
<ul>
<li><strong>Application vetting</strong>. On an application store, applications are vetted against a policy. The process depends greatly on the store, with Apple&#8217;s process being the most well-known, mostly because the policy it enforces is not compleltely clear, and the process is fully opaque. In all cases, the existence of a vetting process provides a good place to attempt the identification and rejection of malware.</li>
<li><strong>Application banning</strong>. As soon as an application is recognized as malware, it can be banned from an application store, immediately stopping its distribution. This also allows application store managers to analyze the application and enhance their vetting process to better catch similar malware.</li>
<li><strong>Kill switches</strong>. That&#8217;s the extra mile after banning, which is (confirmed?) implemented in both Apple&#8217;s and Google&#8217;s application stores. Once an application is banned from the store, it can be removed or deactivated on all devicess, as soon as they connect to the store (usually to check for updates). This also will lead to a reduction of the impact of malware.</li>
<li><strong>Other enforcement means</strong>. Some people argue that automated kill switches are overkill. Alternatives are possible, which may show up if the amount of malware rises significantly. For instance, once an application is identified as malware, a popup could be used to warn the user and propose the deactivation/removal of the application.</li>
</ul>
<p>My background is on the vetting process, and more specifically, on the security analysis of mobile applications. At Trusted Labs, I have practiced several types of analysis of applications, including:</p>
<ul>
<li><strong>In-depth white-box evaluations</strong>. That&#8217;s the best kind of analysis, in which the evaluator has access to the application&#8217;s source code and related documentation, in addition to the running code. Hiding malware is possible, of course, but it requires significant effort, and it is very hard to use the same technique twice (at least with the same evaluator/lab). However, such evaluations are very expensive, they require the developer to provide source code, and they are basically used only for really sensitive applications, like payment applications.</li>
<li><strong>In-depth black-box evaluations</strong>. Here, the evaluator only gets a copy of the application (<em>i.e.</em>, binary code only), together with the user documentation. Usually, such an evaluation is performed in a fixed, limited time, and it relies heavily on the intuition of the evaluator. The process usually starts with some automated analysis of the application, at least a simple one. For instance, knowing which permissions are requested and in which APIs they are used already provides an interesting point of view on the application. For instance, it may help identify an application that requests access to Internet and read access to contact data, and combines them to dump its user&#8217;s contacts to a spam vendor. The costs are usually lower than for white-box evaluations, and all necessary information is available in application stores. However, such processes remain expensive, and should be reserved for some applications (for instance, suspicious applications, applications that require sensitive permissions, or high-profile applications.</li>
<li><strong>Shallow black-box evaluations</strong>. In that case, cost is the priority, and the process is likely to be mostly automated. Here, static code analysis is at the heart of the process. Here, the objective is to design an automated analysis with an extremely low rate of false negatives (applications that violate the policy and pass the evaluation), and the lowest possible rate of false positives (applications that follow the policy and are rejected by the evaluation). Of course, the policy must also be flexible enough to allow the most common behaviors to pass the evaluation. Here, the cost of the static analysis is very low, and the actual cost depends on the proportion of applications that need to undergo an in-depth evaluation.</li>
</ul>
<p>When we discussed malware at the Barcamp, I claimed (live and on Twitter) that static analysis could be effective, and it seems that not everybody agreed with me, in particular <a href="http://twitter.com/#!/heathcr" class="liexternal">Craig Heath</a>, although we reach similar conclusions about <a href="http://franklinheath.co.uk/2010/12/30/2011-not-the-year-of-mobile-malware/" class="liexternal">mobile malware in 2011</a>.</p>
<p>The basic reason for our disagreement may be the definition of static analysis, and what the target is. Here are a few things about static analysis:</p>
<ul>
<li>Static analysis is about analyzing <em>binary</em> code. We want to analyze the code that will actually run on the devices, so let&#8217;s not bother with source code analysis: source code analysis is a tool for developers, basically useless in application stores.</li>
<li>Static analysis is about <em>proving</em> properties on this binary code. The notion of proof is important, as we want to make sure that the applications that pass static analysis actually satisfy all policy rules.</li>
<li>Static analysis works much better on <em>structured</em> code, <em>i.e.</em>, on code on which we have some guarantees, like Java bytecode. We can do really interesting things on bytecode-based frameworks, because the technology is now ready. On native code, the problem is more difficult, because it is much more difficult to prove properties. Nevertheless, technology keeps evolving, and native code analysis is progressing.</li>
<li>Static analysis should not be <em>fully</em> automated. Instead, it should be complemented by other ways to verify what it wasn&#8217;t able to prove. Of course, the a good tool will reject few applications and require llittle human involvement, but it is always necessary to monitor the developer practices and manually approve or reject some applications.</li>
<li>Static analysis should <em>evolve</em>, or at least the policies it checks should evolve. Policies usually evolve by replacing a very restrictive policy by a less restrictive and more precise one. On the first evaluations I did, a typical rule was &#8220;The application should not connect to Internet&#8221;; it beecame &#8220;The application should only connect to its issuer&#8217;s domain&#8221;, and then to &#8220;The application should only connect to statically defined domains&#8221;, to basically no rule (although in practice the last one should be satisfied by most applications, which only connect to a few fixed sites). Such changes follows the current practice, as well as the evolution of trust between users/operators/distributors and developers.</li>
</ul>
<p>So, static analysis is a way to exploit the adapted <a href="http://en.wikipedia.org/wiki/Business_intelligence" rel="nofollow" class="liwikipedia">Business Intelligence</a> techniques that Craig Heath rightly favors. What I have noticed over several years of using static analysis tools in evaluations is that they greatly simplify the work of a human evaluator, but they have a hard time dealing with two things: very complex applications, and applications that are &#8220;borderline&#8221; with respect to the policy. Because of that, a human being needs to validate its results (at least, the rejections). As we know, borderline applications often are the disruptive ones, and it is not acceptable to reject them.</p>
<p>In 2011, we will see what kind of malware comes up, but at least on some platforms, static analysis will play a role in the application vetting process, making it much more efficient on the simple applications, and allowing evaluators to spend more time in the vetting of sensitive/complex applications. And in the end, the infrastructure is quite likely to win the fight with very limited impact on the end users. So, like in the past 10 years, we are not yet on the year of mobile malware. </p>
]]></content:encoded>
			<wfw:commentRss>https://javacard.vetilles.com/2011/01/20/2011-the-year-of-mobile-malware-nope/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
