<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: veit</title>
    <description>The latest articles on Forem by veit (@fenceposterror).</description>
    <link>https://forem.com/fenceposterror</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F22479%2Ffc916ff9-44e0-4b69-abee-5b778ff3c1ed.jpg</url>
      <title>Forem: veit</title>
      <link>https://forem.com/fenceposterror</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fenceposterror"/>
    <language>en</language>
    <item>
      <title>Hacking Open Source Software for Fun and Non-Profit</title>
      <dc:creator>veit</dc:creator>
      <pubDate>Mon, 26 Jun 2017 14:25:12 +0000</pubDate>
      <link>https://forem.com/fenceposterror/hacking-open-source-software-for-fun-and-non-profit</link>
      <guid>https://forem.com/fenceposterror/hacking-open-source-software-for-fun-and-non-profit</guid>
      <description>&lt;p&gt;&lt;em&gt;The original article was posted on &lt;a href="https://fenceposterror.github.io/2017/06/16/Hacking-For-Fun-And-Non-Profit.html" rel="noopener noreferrer"&gt;fenceposterror.github.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;«Hacking Open Source Software for Fun and Non-Profit» is the title of &lt;a href="http://haxx.ml/post/137946990286/hacking-open-source-software-for-fun-and" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; by fellow security researcher &lt;a href="https://twitter.com/addelindh" rel="noopener noreferrer"&gt;@addelindh&lt;/a&gt;. Testing Open Source Software (OSS) is something that has been on my to-do list for a while, because I am convinced that a certain amount of time should be dedicated to it. The reason for this is simple: I firmly believe in giving back to a community that I rely on on a daily basis. This blog post is about an ongoing audit of the &lt;a href="http://ampache.org" rel="noopener noreferrer"&gt;Ampache&lt;/a&gt; media streaming server, the vulnerabilities found and lessons learned. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7ih55faysl7ykv6xz3je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7ih55faysl7ykv6xz3je.png" alt="sqli"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Ampache website:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A web based audio/video streaming application and file manager allowing you to access your music &amp;amp; videos from anywhere, using almost any internet enabled device.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Goals
&lt;/h2&gt;

&lt;p&gt;The three main goals were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give something back to the community&lt;/li&gt;
&lt;li&gt;Learn more about code auditing&lt;/li&gt;
&lt;li&gt;Try out RIPS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I had been curious about &lt;a href="https://www.ripstech.com" rel="noopener noreferrer"&gt;RIPS&lt;/a&gt;, for a while, partially because of their &lt;a href="https://www.ripstech.com/blog/2016/apav-advent-of-php-application-vulnerabilities/" rel="noopener noreferrer"&gt;Advent of PHP Application Vulnerabilities&lt;/a&gt;. When I wanted to purchase an on-demand license, they were so generous and offered me a free trial, once they heard what I wanted to use it for. Thanks, guys! &lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unquoted SQL Injections
&lt;/h3&gt;

&lt;p&gt;Most of my previously conducted audits for my employers I had to conduct without code – searching manually for vulnerabilities in a deployed instance. Working directly with code made me a bit overeager and I reported a vulnerability that I thought was especially cool: unquoted SQL injections. I did so in a hurry and without verification and reported a false positive. Unquoted SQL injections are seldom covered.  If you haven’t read about unquoted SQL injections, I highly recommend reading the article &lt;a href="http://www.webappsec.org/projects/articles/091007.txt" rel="noopener noreferrer"&gt;The Unexpected SQL Injection&lt;/a&gt;. An article discussing the exploitation of an unquoted SQL injection can be found on the RIPS blog, titled &lt;a href="https://www.ripstech.com/blog/2016/vtiger-sql-injection/" rel="noopener noreferrer"&gt;Guest Post: Vtiger 6.5.0 - SQL Injection&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Bypassing quote()
&lt;/h3&gt;

&lt;p&gt;I went back to check what went wrong and learned something else interesting. There was a method named &lt;code&gt;escape&lt;/code&gt; in &lt;a href="https://github.com/ampache/ampache-debian/blob/master/lib/class/dba.class.php#L132" rel="noopener noreferrer"&gt;dba.class.php&lt;/a&gt;, that I had overlooked&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="mi"&gt;132&lt;/span&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;133&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;134&lt;/span&gt;            &lt;span class="nv"&gt;$dbh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dbh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="mi"&gt;135&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$dbh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;136&lt;/span&gt;                &lt;span class="nf"&gt;debug_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Dba'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Wrong dbh.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;137&lt;/span&gt;                &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;138&lt;/span&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;139&lt;/span&gt;            &lt;span class="nv"&gt;$var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$dbh&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;140&lt;/span&gt;            &lt;span class="c1"&gt;// This is slightly less ugly than it was, but still ugly&lt;/span&gt;
&lt;span class="mi"&gt;141&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;142&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I had looked once, I would have noticed that things got quoted and therefore should have been fine, skipping the nuisance for the developers. The interesting part is on the second look in line 141. &lt;code&gt;substr&lt;/code&gt; can break a properly quoted string. While in this case it doesn’t, it is quite nice that RIPS knows - it is worth not just assuming that the method is safe. RIPS also offers configuration options where one can set not automatically discovered validators and sanitizers. &lt;/p&gt;

&lt;h3&gt;
  
  
  Find Vulnerabilities in Non-Active Code
&lt;/h3&gt;

&lt;p&gt;One of the pitfalls in manual-only testing is that you won't see functionality that is not configured. Ampache has a function to log successful logins of users. In that function it also logs the user agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="mi"&gt;911&lt;/span&gt;    &lt;span class="nv"&gt;$agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dba&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HTTP_USER_AGENT'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code is never reached, if the default setting of &lt;code&gt;track_user_ip&lt;/code&gt; is not changed to &lt;code&gt;true&lt;/code&gt;. While this instance is safe, there is a lot more functionality, like connecting to other services among other features, which I haven’t yet investigated. They are turned off by default. It seems there is more. &lt;/p&gt;

&lt;h3&gt;
  
  
  Logic Errors Are Difficult to Find with Static Code Analysis
&lt;/h3&gt;

&lt;p&gt;During the quick manual checks in the beginning, I noticed the app is missing a CSRF token for changing passwords and it also doesn’t ask for the old password. Since I hadn’t worked much with static code analyzers before, their shortcomings were not obvious to me. However, finding them is impossible with this sort of approach due to the fact that they’re logical application errors. Just as a side note, when I wanted to report the change password issues, I noticed, that it had already been reported as &lt;a href="https://github.com/ampache/ampache/issues/539" rel="noopener noreferrer"&gt;issue 539&lt;/a&gt;, but this hasn’t been addressed yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Same PHP Object Instantiation but Different
&lt;/h3&gt;

&lt;p&gt;My favorite issue, maybe because I haven’t cracked it yet, is a PHP Object Instantiation, something that could be considering a sub-class of PHP Object Injections (POI). Usually when there is talk of a POI vulnerability, one thinks of unserialize and magic functions. This one is different.&lt;/p&gt;

&lt;p&gt;Quick excursion: Ampache has multi-user support for playlists. While the playlist is playing, other users can vote for songs or suggest songs. Depending on those votes, the next song will be chosen. This feature is called when choosing democratic as type of playback in the streaming. The following vulnerability is located in the voting feature.&lt;/p&gt;

&lt;p&gt;First, the GET parameter &lt;code&gt;type&lt;/code&gt; is received in line 43 of democratic.ajax.php and passed to the &lt;code&gt;add_vote&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="mi"&gt;43&lt;/span&gt;      &lt;span class="nv"&gt;$democratic&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;add_vote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'object_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$_REQUEST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;'object_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$_REQUEST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'object_id'&lt;/span&gt;&lt;span class="p"&gt;])));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The method is defined in &lt;a href="https://github.com/ampache/ampache/blob/develop/lib/class/democratic.class.php#L348" rel="noopener noreferrer"&gt;democratic.class.php&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="mi"&gt;348&lt;/span&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;add_vote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;349&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;350&lt;/span&gt;            &lt;span class="cm"&gt;/* Iterate through the objects if no vote, add to playlist and vote */&lt;/span&gt;
&lt;span class="mi"&gt;351&lt;/span&gt;            &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;352&lt;/span&gt;                &lt;span class="nv"&gt;$type&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;353&lt;/span&gt;                &lt;span class="nv"&gt;$object_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;354&lt;/span&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;has_vote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$object_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;355&lt;/span&gt;                    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;_add_vote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$object_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;356&lt;/span&gt;                &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;357&lt;/span&gt;            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// end foreach&lt;/span&gt;
&lt;span class="mi"&gt;358&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// vote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In line 355 &lt;code&gt;type&lt;/code&gt; parameter is passed to &lt;code&gt;_add_vote&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="mi"&gt;396&lt;/span&gt;        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;_add_vote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$object_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$object_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'song'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;397&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;398&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tmp_playlist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;399&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt;            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;401&lt;/span&gt;    
&lt;span class="mi"&gt;402&lt;/span&gt;            &lt;span class="nv"&gt;$media&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nv"&gt;$object_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$object_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt;                  &lt;span class="mf"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally in line 402 the object is instantiated.&lt;/p&gt;

&lt;p&gt;When looking for this kind of POI, there is little information on it. I had found this &lt;a href="https://t.co/tWctpDI45H" rel="noopener noreferrer"&gt;security exchange post&lt;/a&gt; and &lt;a href="https://www.twitter.com/floyd_ch" rel="noopener noreferrer"&gt;@floyd_ch&lt;/a&gt; was so kind to point me to probably the best article on this subject: &lt;a href="https://blog.leakfree.nl/2015/03/12/php-object-instantiation-cve-2015-1033/" rel="noopener noreferrer"&gt;PHP Object Instantiation&lt;/a&gt;. If someone takes a shot at it, I’d be very curious to know if they find a chain that makes this exploitable. &lt;/p&gt;

&lt;p&gt;RIPS also found various authenticated reflected XSS (issues &lt;a href="https://github.com/ampache/ampache/issues/1533" rel="noopener noreferrer"&gt;1533&lt;/a&gt;, &lt;a href="https://github.com/ampache/ampache/issues/1532" rel="noopener noreferrer"&gt;1532&lt;/a&gt; and &lt;a href="https://github.com/ampache/ampache/issues/1541" rel="noopener noreferrer"&gt;1541&lt;/a&gt;) and also authenticated SQLi (issue &lt;a href="https://github.com/ampache/ampache/issues/1536" rel="noopener noreferrer"&gt;1536&lt;/a&gt;). The best documentation of those is always right in the tickets themselves. I'll leave possible exploit chains up to the reader's imagination.&lt;/p&gt;

&lt;h3&gt;
  
  
  Organizational Issues
&lt;/h3&gt;

&lt;p&gt;Regarding the organizational aspects of auditing OSS, how do you report a vulnerability to an open source project that doesn’t have a dedicated e-mail address set up? In this case I asked in the mailing list beforehand and they said to just file an issue. It would be really nice to be able to report an issue as “private so only the reporter and the admins can see the issue. This would be a great feature for Github to implement. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;First of all, I’m not done yet, and if something else pops up worth discussing, I will write another blog post. &lt;/p&gt;

&lt;p&gt;Mapping a detected vulnerability in the browser to the code, if you are not very familiar with the code base is an interesting activity. Also doing the inverse was fun. Finding something manually and then trying to find the matching finding of RIPS.&lt;/p&gt;

&lt;p&gt;It is worth pointing out, that OSS is hard. This project is done completely by volunteers without doing this on their job time. Some of the vulnerabilities were closed quickly. Others are still open. I also have not reported everything yet, giving the developers a chance to close one by one without sending them too many reports at once. It seems like they’ll soon release a last version including the patches and then try to port the project to the Laravel framework. &lt;/p&gt;

&lt;p&gt;Thanks to RIPStech who let me play with their code analysis solution to contribute to open source! It is easy to use and has a comfortable GUI, that lets you explore the code very comfortably. It is noticeable that the solution was developed by people who use it themselves - providing features tailored to bug hunters. Last but not least an appeal to security researchers, pentesters, white hats or whatever you call yourselves: If you have some spare time, consider hacking open source software. Let’s do our part and contribute.&lt;/p&gt;

</description>
      <category>security</category>
      <category>hacking</category>
      <category>opensource</category>
      <category>ampache</category>
    </item>
  </channel>
</rss>
