This is a good article. Click here for more information.

Heartbleed

From Infogalactic: the planetary knowledge core
Jump to: navigation, search

<templatestyles src="Module:Hatnote/styles.css"></templatestyles>

Logo representing Heartbleed. Security company Codenomicon gave Heartbleed both a name and a logo, contributing to public awareness of the issue.[1][2]

Heartbleed is a security bug disclosed in April 2014 in the OpenSSL cryptography library, which is a widely used implementation of the Transport Layer Security (TLS) protocol. Heartbleed may be exploited regardless of whether the party using a vulnerable OpenSSL instance for TLS is a server or a client. It results from improper input validation (due to a missing bounds check) in the implementation of the TLS heartbeat extension,[3] thus the bug's name derives from "heartbeat".[4] The vulnerability is classified as a buffer over-read,[5] a situation where more data can be read than should be allowed.[6]

Heartbleed is registered in the Common Vulnerabilities and Exposures system as CVE-2014-0160.[5] The federal Canadian Cyber Incident Response Centre issued a security bulletin advising system administrators about the bug.[7] A fixed version of OpenSSL was released on April 7, 2014, on the same day Heartbleed was publicly disclosed.

At the time of disclosure, some 17% (around half a million) of the Internet's secure web servers certified by trusted authorities were believed to be vulnerable to the attack, allowing theft of the servers' private keys and users' session cookies and passwords.[8][9][10][11][12] The Electronic Frontier Foundation,[13] Ars Technica,[14] and Bruce Schneier[15] all deemed the Heartbleed bug "catastrophic". Forbes cybersecurity columnist Joseph Steinberg wrote, "Some might argue that [Heartbleed] is the worst vulnerability found (at least in terms of its potential impact) since commercial traffic began to flow on the Internet."[16]

A British Cabinet spokesman recommended that "People should take advice on changing passwords from the websites they use... Most websites have corrected the bug and are best placed to advise what action, if any, people need to take."[17] On the day of disclosure, the Tor Project advised anyone seeking "strong anonymity or privacy on the Internet" to "stay away from the Internet entirely for the next few days while things settle."[18]

As of May 20, 2014, 1.5% of the 800,000 most popular TLS-enabled websites were still vulnerable to Heartbleed.[19]

TLS implementations other than OpenSSL, such as GnuTLS, Mozilla's Network Security Services, and the TLS stack used by Microsoft products, were not affected because the defect existed in the OpenSSL's implementation of TLS rather than in the Internet protocol itself.[20]

History

The Heartbeat Extension for the Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) protocols was proposed as a standard in February 2012 by RFC 6520.[21] It provides a way to test and keep alive secure communication links without the need to renegotiate the connection each time. In 2011, one of the RFC's authors, Robin Seggelmann, then a Ph.D. student at the Fachhochschule Münster, implemented the Heartbeat Extension for OpenSSL. Following Seggelmann's request to put the result of his work into OpenSSL,[22][23][24] his change was reviewed by Stephen N. Henson, one of OpenSSL's four core developers. Henson failed to notice a bug in Seggelmann's implementation, and introduced the flawed code into OpenSSL's source code repository on December 31, 2011. The flaw spread with the release of OpenSSL version 1.0.1 on March 14, 2012. Heartbeat support was enabled by default, causing affected versions to be vulnerable.[25][26][27]

Discovery

According to Mark J. Cox of OpenSSL, Neel Mehta of Google's security team reported Heartbleed on April 1, 2014.[28]

The bug was named by an engineer at Codenomicon, a Finnish cybersecurity company that also created the bleeding heart logo and launched the domain heartbleed.com to explain the bug to the public.[29] According to Codenomicon, Google's security team reported Heartbleed to OpenSSL first, but both Google and Codenomicon discovered it independently.[25] Codenomicon reports April 3, 2014 as their date of discovery and their date of notification of NCSC-FI for vulnerability coordination.[25][30]

The Sydney Morning Herald published a timeline of the discovery on April 15, 2014, showing that some organizations had been able to patch the bug before its public disclosure. In some cases, it is not clear how they found out.[31]

Bugfix and deployment

Bodo Moeller and Adam Langley of Google prepared the fix for Heartbleed. The resulting patch was added to Red Hat's issue tracker on March 21, 2014.[32] Stephen N. Henson applied the fix to OpenSSL's version control system on 7 April.[33] The first fixed version, 1.0.1g, was released on the same day. As of June 21, 2014, 309,197 public web servers remained vulnerable.[34]

Certificate renewal and revocation

According to Netcraft, about 30,000 of the 500,000+ X.509 certificates which could have been compromised due to Heartbleed had been reissued by April 11, 2014, although fewer had been revoked.[35]

By May 9, 2014, only 43% of affected web sites had reissued their security certificates. In addition, 7% of the reissued security certificates used the potentially compromised keys. "By reusing the same private key, a site that was affected by the Heartbleed bug still faces exactly the same risks as those that have not yet replaced their SSL certificates," Netcraft stated. eWeek said, Heartbleed is "likely to remain a risk for months, if not years, to come."[36]

Exploitation

The Canada Revenue Agency reported a theft of Social Insurance Numbers belonging to 900 taxpayers, and said that they were accessed through an exploit of the bug during a 6-hour period on April 8, 2014.[37] After the discovery of the attack, the agency shut down its website and extended the taxpayer filing deadline from April 30 to May 5.[38] The agency said it would provide anyone affected with credit protection services at no cost. On April 16, the RCMP announced they had charged an engineering student in relation to the theft with "unauthorized use of a computer" and "mischief in relation to data".[39][40]

The UK parenting site Mumsnet had several user accounts hijacked, and its CEO was impersonated.[41] The site later published an explanation of the incident saying it was due to Heartbleed and the technical staff patched it promptly.[42]

Anti-malware researchers also exploited Heartbleed to their own advantage in order to access secret forums used by cybercriminals.[43] Studies were also conducted by deliberately setting up vulnerable machines. For example, on April 12, 2014, at least two independent researchers were able to steal private keys from an experimental server intentionally set up for that purpose by CloudFlare.[44][45] Also, on April 15, 2014, J. Alex Halderman, a professor at University of Michigan, reported that his honeypot server, an intentionally vulnerable server designed to attract attacks in order to study them, had received numerous attacks originating from China. Halderman concluded that because it was a fairly obscure server, these attacks were probably sweeping attacks affecting large areas of the Internet.[46]

In August 2014, it was made public that the Heartbleed vulnerability enabled hackers to steal security keys from Community Health Systems, the second-biggest for-profit U.S. hospital chain in the United States, compromising the confidentiality of 4.5 million patient records. The breach happened a week after Heartbleed was first made public.[47]

Possible prior knowledge and exploitation

Many major web sites patched the bug or disabled the Heartbeat Extension within days of its announcement,[48] but it is unclear whether potential attackers were aware of it earlier and to what extent it was exploited.

Based on examinations of audit logs by researchers, it has been reported that some attackers may have exploited the flaw for at least five months before discovery and announcement.[49][50] Errata Security pointed out that a widely used non-malicious program called "Masscan", introduced six months before Heartbleed's disclosure, abruptly terminates the connection in the middle of handshaking in the same way as Heartbleed, generating the same server log messages, adding "Two new things producing the same error messages might seem like the two are correlated, but of course, they aren't".[51]

According to Bloomberg News, two unnamed insider sources informed it that the United States' National Security Agency had been aware of the flaw since shortly after its appearance but—​​instead of reporting it—​​kept it secret among other unreported zero-day vulnerabilities in order to exploit it for the NSA's own purposes.[52][53][54] The NSA has denied this claim,[55] as has Richard A. Clarke, a member of the National Intelligence Review Group on Intelligence and Communications Technologies that reviewed the United States' electronic surveillance policy; he told Reuters on April 11, 2014 that the NSA had not known of Heartbleed.[56] The allegation prompted the American government to make, for the first time, a public statement on its zero-day vulnerabilities policy, accepting the recommendation of the review group's 2013 report that had asserted "in almost all instances, for widely used code, it is in the national interest to eliminate software vulnerabilities rather than to use them for US intelligence collection", and saying that the decision to withhold should move from the NSA to the White House.[57]

Behavior

A depiction of Heartbleed

The RFC 6520 Heartbeat Extension tests TLS/DTLS secure communication links by allowing a computer at one end of a connection to send a "Heartbeat Request" message, consisting of a payload, typically a text string, along with the payload's length as a 16-bit integer. The receiving computer then must send exactly the same payload back to the sender.

The affected versions of OpenSSL allocate a memory buffer for the message to be returned based on the length field in the requesting message, without regard to the actual size of that message's payload. Because of this failure to do proper bounds checking, the message returned consists of the payload, possibly followed by whatever else happened to be in the allocated memory buffer.

Heartbleed is therefore exploited by sending a malformed heartbeat request with a small payload and large length field to the vulnerable party (usually a server) in order to elicit the victim's response, permitting attackers to read up to 64 kilobytes of the victim's memory that was likely to have been used previously by OpenSSL.[58] Where a Heartbeat Request might ask a party to "send back the four-letter word 'bird'", resulting in a response of "bird", a "Heartbleed Request" (a malicious heartbeat request) of "send back the 500-letter word 'bird'" would cause the victim to return "bird" followed by whatever 496 characters the victim happened to have in active memory. Attackers in this way could receive sensitive data, compromising the confidentiality of the victim's communications. Although an attacker has some control over the disclosed memory block's size, it has no control over its location, and therefore cannot choose what content is revealed.

Affected OpenSSL installations

The affected versions of OpenSSL are OpenSSL 1.0.1 through 1.0.1f (inclusive). Subsequent versions (1.0.1g[59] and later) and previous versions (1.0.0 branch and older) are not vulnerable.[60] Installations of the affected versions are vulnerable unless OpenSSL was compiled with -DOPENSSL_NO_HEARTBEATS.[61][62]

Vulnerable program and function

The vulnerable program source files are t1_lib.c and d1_both.c and the vulnerable functions are tls1_process_heartbeat() and dtls1_process_heartbeat().[63][64]

Patch

The problem can be fixed by ignoring Heartbeat Request messages that ask for more data than their payload needs.

Version 1.0.1g of OpenSSL adds some bounds checks to prevent the buffer over-read. For example, the following test has been added, which discards the Heartbeat Request preventing a reply from being constructed if it would trigger the Heartbleed:

if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */

The version control system contains a complete list of changes.[33]

Impact

The data obtained by a Heartbleed attack may include unencrypted exchanges between TLS parties likely to be confidential, including any form post data in users' requests. Moreover, the confidential data exposed could include authentication secrets such as session cookies and passwords, which might allow attackers to impersonate a user of the service.[65]

An attack may also reveal private keys of compromised parties,[25][27][66] which would enable attackers to decrypt communications (future or past stored traffic captured via passive eavesdropping, unless perfect forward secrecy is used, in which case only future traffic can be decrypted if intercepted via man-in-the-middle attacks).

An attacker having gained authentication material may impersonate the material's owner after the victim has patched Heartbleed, as long as the material is accepted (for example, until the password is changed or the private key revoked). Heartbleed therefore constitutes a critical threat to confidentiality. However, an attacker impersonating a victim may also alter data. Indirectly, Heartbleed's consequences may thus go far beyond a confidentiality breach for many systems.[67]

A survey of American adults conducted in April 2014 showed that 60 percent had heard about Heartbleed. Among those using the Internet, 39 percent had protected their online accounts, for example by changing passwords or canceling accounts; 29 percent believed their personal information was put at risk because of the Heartbleed bug; and 6 percent believed their personal information had been stolen.[68]

Client-side vulnerability

Although the bug received more attention due to the threat it represents for servers,[69] TLS clients using affected OpenSSL instances are also vulnerable. In what The Guardian therefore dubbed "reverse Heartbleed", malicious servers are able to exploit Heartbleed to read data from a vulnerable client's memory.[70] Security researcher Steve Gibson said of Heartbleed that "it's not just a server-side vulnerability, it's also a client-side vulnerability because the server, or whomever you connect to, is as able to ask you for a heartbeat back as you are to ask them."[71]

The stolen data could contain usernames and passwords.[72] Reverse Heartbleed affected millions of application instances.[70] Some of the vulnerable applications are listed in the "Software applications" section below.

Specific systems affected

Cisco Systems has identified 78 of its products as vulnerable, including IP phone systems and telepresence (video conferencing) systems.[73]

Websites and other online services

An analysis posted on GitHub of the most visited websites on April 8, 2014 revealed vulnerabilities in sites including Yahoo!, Imgur, Stack Overflow, Slate, and DuckDuckGo.[74][75] The following sites have services affected or made announcements recommending that users update passwords in response to the bug:

<templatestyles src="Div col/styles.css"/>

The Canadian federal government temporarily shut online services of the Canada Revenue Agency (CRA) and several government departments over Heartbleed bug security concerns.[100][101]

Platform maintainers like the Wikimedia Foundation advised their users to change passwords.[97]

The servers of LastPass were vulnerable,[102] but due to additional encryption and forward secrecy, potential attacks were not able to exploit this bug. However, LastPass recommended that its users change passwords for vulnerable websites.[103]

The Tor Project recommended that Tor relay operators and hidden service operators revoke and generate fresh keys after patching OpenSSL, but noted that Tor relays use two sets of keys and that Tor's multi-hop design minimizes the impact of exploiting a single relay.[18] 586 relays later found to be susceptible to the Heartbleed bug were taken off-line as a precautionary measure.[104][105][106][107]

Game-related services including Steam, Minecraft, Wargaming.net, League of Legends, GOG.com, Origin, Sony Online Entertainment, Humble Bundle, and Path of Exile were affected and subsequently fixed.[108]

Software applications

Vulnerable software applications include:

  • Several Hewlett-Packard server applications, such as HP System Management Homepage (SMH) for Linux and Windows.[109]
  • Some versions of FileMaker 13[110]
  • LibreOffice 4.2.0 to 4.2.2 (fixed in 4.2.3)[111][112]
  • LogMeIn claimed to have "updated many products and parts of our services that rely on OpenSSL".[113]
  • Multiple McAfee products, in particular some versions of software providing anti-viral coverage for Microsoft Exchange, software firewalls, and McAfee Email and Web Gateways[114]
  • MySQL Workbench 6.1.4 and earlier[115]
  • Oracle MySQL Connector/C 6.1.0-6.1.3 and Connector/ODBC 5.1.13, 5.2.5-5.2.6, 5.3.2[115]
  • Oracle Big Data Appliance (includes Oracle Linux 6)[115]
  • Primavera P6 Professional Project Management (includes Primavera P6 Enterprise Project Portfolio Management)[115]
  • WinSCP (FTP client for Windows) 5.5.2 and some earlier versions (only vulnerable with FTP over TLS/SSL, fixed in 5.5.3)[116]
  • Multiple VMware products, including VMware ESXi 5.5, VMware Player 6.0, VMware Workstation 10 and the series of Horizon products, emulators and cloud computing suites[117]

Several other Oracle Corporation applications were affected.[115]

Operating systems/firmwares

Several GNU/Linux distributions were affected, including Debian[118] (and derivatives such as Linux Mint and Ubuntu[119]) and Red Hat Enterprise Linux[120] (and derivatives such as CentOS,[121] Oracle Linux 6[115] and Amazon Linux[122]), as well as the following operating systems and firmware implementations:

Vulnerability testing services

Several services have been made available to test whether Heartbleed affects a given site. However, many services have been claimed to be ineffective for detecting the bug.[134] The available tools include:

  • Tripwire SecureScan[135]
  • AppCheck - static binary scan, from Codenomicon[136]
  • Arbor Network's Pravail Security Analytics[137]
  • Norton Safeweb Heartbleed Check Tool[138]
  • Heartbleed testing tool by a European IT security company[139]
  • Heartbleed Scanner by Italian cryptologist Filippo Valsorda[140]
  • Heartbleed Vulnerability Test by Cyberoam[141]
  • Critical Watch Free Online Heartbleed Tester[142]
  • Metasploit Heartbleed scanner module[143]
  • Heartbleed Server Scanner by Rehmann[144]
  • Lookout Mobile Security Heartbleed Detector, an app for Android devices that determines the OpenSSL version of the device and indicates whether the vulnerable heartbeat is enabled[145]
  • Heartbleed checker hosted by LastPass[146]
  • Online network range scanner for Heartbleed vulnerability by Pentest-Tools.com[147]
  • Official Red Hat offline scanner written in the Python language[148]
  • Qualys SSL Labs' SSL Server Test[149] which not only looks for the Heartbleed bug, but can also find other SSL/TLS implementation errors.
  • Browser extensions, such as Chromebleed[150] and FoxBleed[151]
  • SSL Diagnos[152]
  • CrowdStrike Heartbleed Scanner[153] - Scans routers, printers and other devices connected inside a network including intranet web sites.[154]
  • Netcraft Site Report[155] - indicates whether a website's confidentiality could be jeopardized due to a past exploitation of Heartbleed by checking data from Netcraft's SSL Survey to determine whether a site offered the heartbeat TLS Extension prior to the Heartbleed disclosure. The Netcraft Extensions for Chrome, Firefox and Opera[156] also perform this check, whilst looking for potentially compromised certificates.[157]

Other security tools have added support for finding this bug. For example, Tenable Network Security wrote a plugin for its Nessus vulnerability scanner that can scan for this fault.[158] The Nmap security scanner includes a Heartbleed detection script from version 6.45.[159]

Sourcefire has released Snort rules to detect Heartbleed attack traffic and possible Heartbleed response traffic.[160] Open source packet analysis software such as Wireshark and tcpdump can identify Heartbleed packets using specific BPF packet filters that can be used on stored packet captures or live traffic.[161]

Remediation

Although installing fixed software (dynamic versions of the OpenSSL library and binaries using OpenSSL statically) is a necessary step to address Heartbleed, more work may be needed. Running applications depending on OpenSSL may continue to use in-memory vulnerable OpenSSL code until they have been restarted before they stop being vulnerable.

Furthermore, a system attacked via Heartbleed may have its confidentiality and even its integrity at risk even after the vulnerability itself has been fixed. To regain confidentiality and authenticity, compromised servers must regenerate all compromised private key-public key pairs and must revoke and replace all certificates linked to these. In general, all compromised authentication material (such as passwords) must be replaced since it is rarely possible to confirm that a system which was affected has not been compromised.[162]

Consequences of Heartbleed may remain even after the vulnerability was fixed and all compromised authentication material revoked. Much more system-specific work may be needed to confirm or restore the system's integrity, which may have been compromised if attackers used compromised authentication material to impersonate users in order to perform unauthorized modifications.

Browser security certificate revocation awareness

Since Heartbleed threatened the privacy of private keys, users of a website which was compromised could suffer from Heartbleed's effects even after the website was fixed and its previous certificate revoked, if their browser is unaware of certification revocations. The Security Certificate Revocation Awareness Test does not test whether a system has the Heartbleed bug, but allows users to test whether their web browser lets them visit a website which uses a revoked security certificate.[163][164]

Root causes, possible lessons, and reactions

Although evaluating the total cost of Heartbleed is difficult, eWEEK estimated US$500 million as a starting point.[165]

David A. Wheeler's paper How to Prevent the next Heartbleed analyzes why Heartbleed wasn't discovered earlier, and suggests several techniques which could have led to a faster identification, as well as techniques which could have reduced its impact. According to Wheeler, the most efficient technique which could have prevented Heartbleed is an atypical test suite thoroughly performing what he calls "negative testing", i.e. testing that invalid inputs cause failures rather than successes. Wheeler highlights that a single general-purpose test suite could serve as a base for all TLS implementations.[166]

According to an article on The Conversation written by Robert Merkel, Heartbleed revealed a "massive failure of risk analysis". Merkel thinks OpenSSL gives more importance to performance than to security, which no longer makes sense in his opinion. But Merkel considers that OpenSSL should not be blamed as much as OpenSSL users, who chose to use OpenSSL, without funding better auditing and testing. Merkel explains that 2 aspects determine the risk that more similar bugs will cause vulnerabilities. The library's source code influences the risk of writing bugs with such an impact. Secondly, OpenSSL's processes affect the chances of catching bugs quickly. On the first aspect, Merkel mentions the use of the C programming language as one risk factor which favored Heartbleed's appearance, echoing Wheeler's analysis.[166][167]

On the same aspect, Theo de Raadt, founder and leader of the OpenBSD and OpenSSH projects, has criticized the OpenSSL developers for writing their own memory management routines and thereby, he claims, circumventing OpenBSD C standard library exploit countermeasures, saying "OpenSSL is not developed by a responsible team."[168][169] Following Heartbleed's disclosure, members of the OpenBSD project forked OpenSSL into LibreSSL.[170]

The author of the change which introduced Heartbleed, Robin Seggelmann,[171] stated that he "missed validating a variable containing a length" and denied any intention to submit a flawed implementation.[22] Following Heartbleed's disclosure, Seggelmann suggested focusing on the second aspect, stating that OpenSSL is not reviewed by enough people.[172] Although Seggelmann's work was reviewed by an OpenSSL core developer, the review was also intended to verify functional improvements, a situation making vulnerabilities much easier to miss.[166]

OpenSSL core developer Ben Laurie claimed that a security audit of OpenSSL would have caught Heartbleed.[173] Software engineer John Walsh commented "Think about it, OpenSSL only has two [fulltime] people to write, maintain, test, and review 500,000 lines of business critical code." The OpenSSL foundation's president, Steve Marquess, said "The mystery is not that a few overworked volunteers missed this bug; the mystery is why it hasn't happened more often."[174] David A. Wheeler described audits as an excellent way to find vulnerabilities in typical cases, but noted that "OpenSSL uses unnecessarily complex structures, which makes it harder to both humans and machines to review." He wrote:

There should be a continuous effort to simplify the code, because otherwise just adding capabilities will slowly increase the software complexity. The code should be refactored over time to make it simple and clear, not just constantly add new features. The goal should be code that is “obviously right”, as opposed to code that is so complicated that “I can’t see any problems”.[166]

LibreSSL made a big code cleanup, removing more than 90,000 lines of C code just in its first week.[175]

According to security researcher Dan Kaminsky, Heartbleed is sign of an economic problem which needs to be fixed. Seeing the time taken to catch this simple error in a simple feature from a "critical" dependency, Kaminsky fears numerous future vulnerabilities if nothing is done. When Heartbleed was discovered, OpenSSL was maintained by a handful of volunteers, only one of whom worked full-time.[176] Yearly donations to the OpenSSL project were about US$2,000.[177] The Heartbleed website from Codenomicon advised money donations to the OpenSSL project.[25] After learning about donations for the 2 or 3 days following Heartbleed's disclosure totaling US$841, Kaminsky commented "We are building the most important technologies for the global economy on shockingly underfunded infrastructure."[178] Core developer Ben Laurie has qualified the project as "completely unfunded".[177] Although the OpenSSL Software Foundation has no bug bounty program, the Internet Bug Bounty initiative awarded US$15,000 to Google's Neel Mehta, who discovered Heartbleed, for his responsible disclosure.[177]

Paul Chiusano suggested Heartbleed may have resulted from failed software economics.[179]

The industry's collective response to the crisis was the Core Infrastructure Initiative, a multimillion-dollar project announced by the Linux Foundation on April 24, 2014 to provide funds to critical elements of the global information infrastructure.[180] Founding backers include Amazon, Dell, Facebook, Fujitsu, Google, IBM, Intel, Microsoft, NetApp, Rackspace, VMware and The Linux Foundation. The initiative intends to allow lead developers to work full-time on their projects and to pay for security audits, hardware and software infrastructure, travel, and other expenses.[181] OpenSSL is a candidate to become the first recipient of the initiative's funding.[180]

References

  1. Lua error in package.lua at line 80: module 'strict' not found.
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. Lua error in package.lua at line 80: module 'strict' not found.
  4. Lua error in package.lua at line 80: module 'strict' not found.
  5. 5.0 5.1 Lua error in package.lua at line 80: module 'strict' not found.
  6. Lua error in package.lua at line 80: module 'strict' not found.
  7. Lua error in package.lua at line 80: module 'strict' not found.
  8. Lua error in package.lua at line 80: module 'strict' not found.
  9. Lua error in package.lua at line 80: module 'strict' not found.
  10. Lua error in package.lua at line 80: module 'strict' not found.
  11. Lua error in package.lua at line 80: module 'strict' not found.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Lua error in package.lua at line 80: module 'strict' not found.
  16. Lua error in package.lua at line 80: module 'strict' not found.
  17. Lua error in package.lua at line 80: module 'strict' not found.
  18. 18.0 18.1 Lua error in package.lua at line 80: module 'strict' not found.
  19. Lua error in package.lua at line 80: module 'strict' not found.
  20. Lua error in package.lua at line 80: module 'strict' not found.
  21. Lua error in package.lua at line 80: module 'strict' not found.
  22. 22.0 22.1 Lua error in package.lua at line 80: module 'strict' not found.
  23. Lua error in package.lua at line 80: module 'strict' not found.
  24. Lua error in package.lua at line 80: module 'strict' not found.
  25. 25.0 25.1 25.2 25.3 25.4 Lua error in package.lua at line 80: module 'strict' not found.
  26. Lua error in package.lua at line 80: module 'strict' not found.
  27. 27.0 27.1 Lua error in package.lua at line 80: module 'strict' not found.
  28. Lua error in package.lua at line 80: module 'strict' not found.
  29. Lua error in package.lua at line 80: module 'strict' not found.
  30. Lua error in package.lua at line 80: module 'strict' not found.
  31. Lua error in package.lua at line 80: module 'strict' not found.
  32. Lua error in package.lua at line 80: module 'strict' not found.
  33. 33.0 33.1 Lua error in package.lua at line 80: module 'strict' not found.
  34. Lua error in package.lua at line 80: module 'strict' not found.
  35. Lua error in package.lua at line 80: module 'strict' not found.
  36. Lua error in package.lua at line 80: module 'strict' not found.
  37. Lua error in package.lua at line 80: module 'strict' not found. Some of the details are in the video linked from the page.
  38. Lua error in package.lua at line 80: module 'strict' not found.
  39. Lua error in package.lua at line 80: module 'strict' not found.
  40. Lua error in package.lua at line 80: module 'strict' not found.
  41. 41.0 41.1 Lua error in package.lua at line 80: module 'strict' not found.
  42. Lua error in package.lua at line 80: module 'strict' not found.
  43. Lua error in package.lua at line 80: module 'strict' not found.
  44. Lua error in package.lua at line 80: module 'strict' not found.
  45. Lua error in package.lua at line 80: module 'strict' not found.
  46. Lua error in package.lua at line 80: module 'strict' not found.
  47. Lua error in package.lua at line 80: module 'strict' not found.
  48. Lua error in package.lua at line 80: module 'strict' not found.
  49. Lua error in package.lua at line 80: module 'strict' not found.
  50. Lua error in package.lua at line 80: module 'strict' not found.
  51. Lua error in package.lua at line 80: module 'strict' not found.
  52. Lua error in package.lua at line 80: module 'strict' not found.
  53. Lua error in package.lua at line 80: module 'strict' not found.
  54. Lua error in package.lua at line 80: module 'strict' not found.
  55. Lua error in package.lua at line 80: module 'strict' not found.
  56. Lua error in package.lua at line 80: module 'strict' not found.
  57. Lua error in package.lua at line 80: module 'strict' not found.
  58. Lua error in package.lua at line 80: module 'strict' not found.
  59. Lua error in package.lua at line 80: module 'strict' not found.
  60. Lua error in package.lua at line 80: module 'strict' not found.
  61. Lua error in package.lua at line 80: module 'strict' not found.
  62. Lua error in package.lua at line 80: module 'strict' not found.
  63. Lua error in package.lua at line 80: module 'strict' not found.
  64. Lua error in package.lua at line 80: module 'strict' not found.
  65. Lua error in package.lua at line 80: module 'strict' not found.
  66. Lua error in package.lua at line 80: module 'strict' not found.
  67. Lua error in package.lua at line 80: module 'strict' not found.
  68. Lua error in package.lua at line 80: module 'strict' not found.
  69. Lua error in package.lua at line 80: module 'strict' not found.
  70. 70.0 70.1 Lua error in package.lua at line 80: module 'strict' not found.
  71. Lua error in package.lua at line 80: module 'strict' not found.
  72. Lua error in package.lua at line 80: module 'strict' not found.
  73. 73.0 73.1 Lua error in package.lua at line 80: module 'strict' not found.
  74. Lua error in package.lua at line 80: module 'strict' not found.
  75. Lua error in package.lua at line 80: module 'strict' not found.
  76. Lua error in package.lua at line 80: module 'strict' not found.
  77. Lua error in package.lua at line 80: module 'strict' not found.
  78. Lua error in package.lua at line 80: module 'strict' not found.
  79. Lua error in package.lua at line 80: module 'strict' not found.
  80. Lua error in package.lua at line 80: module 'strict' not found.
  81. Lua error in package.lua at line 80: module 'strict' not found.
  82. Lua error in package.lua at line 80: module 'strict' not found.
  83. Lua error in package.lua at line 80: module 'strict' not found.
  84. Lua error in package.lua at line 80: module 'strict' not found.
  85. Lua error in package.lua at line 80: module 'strict' not found.
  86. Lua error in package.lua at line 80: module 'strict' not found.
  87. Lua error in package.lua at line 80: module 'strict' not found.
  88. Lua error in package.lua at line 80: module 'strict' not found.
  89. Lua error in package.lua at line 80: module 'strict' not found.
  90. Lua error in package.lua at line 80: module 'strict' not found.
  91. Lua error in package.lua at line 80: module 'strict' not found.
  92. Lua error in package.lua at line 80: module 'strict' not found.
  93. Lua error in package.lua at line 80: module 'strict' not found.
  94. Lua error in package.lua at line 80: module 'strict' not found.
  95. Lua error in package.lua at line 80: module 'strict' not found.
  96. Lua error in package.lua at line 80: module 'strict' not found.
  97. 97.0 97.1 Lua error in package.lua at line 80: module 'strict' not found.
  98. Lua error in package.lua at line 80: module 'strict' not found.
  99. Lua error in package.lua at line 80: module 'strict' not found.
  100. Lua error in package.lua at line 80: module 'strict' not found.
  101. Lua error in package.lua at line 80: module 'strict' not found.
  102. Lua error in package.lua at line 80: module 'strict' not found.
  103. Lua error in package.lua at line 80: module 'strict' not found.
  104. Lua error in package.lua at line 80: module 'strict' not found.
  105. Lua error in package.lua at line 80: module 'strict' not found.
  106. Lua error in package.lua at line 80: module 'strict' not found.
  107. Lua error in package.lua at line 80: module 'strict' not found.
  108. Lua error in package.lua at line 80: module 'strict' not found.
  109. Lua error in package.lua at line 80: module 'strict' not found.
  110. Lua error in package.lua at line 80: module 'strict' not found.
  111. Lua error in package.lua at line 80: module 'strict' not found.
  112. Lua error in package.lua at line 80: module 'strict' not found.
  113. Lua error in package.lua at line 80: module 'strict' not found.
  114. Lua error in package.lua at line 80: module 'strict' not found.
  115. 115.0 115.1 115.2 115.3 115.4 115.5 Lua error in package.lua at line 80: module 'strict' not found.
  116. Lua error in package.lua at line 80: module 'strict' not found.
  117. Lua error in package.lua at line 80: module 'strict' not found.
  118. Lua error in package.lua at line 80: module 'strict' not found.
  119. Lua error in package.lua at line 80: module 'strict' not found.
  120. Lua error in package.lua at line 80: module 'strict' not found.
  121. Lua error in package.lua at line 80: module 'strict' not found.
  122. Lua error in package.lua at line 80: module 'strict' not found.
  123. Lua error in package.lua at line 80: module 'strict' not found.
  124. Lua error in package.lua at line 80: module 'strict' not found.
  125. Lua error in package.lua at line 80: module 'strict' not found.
  126. Lua error in package.lua at line 80: module 'strict' not found.
  127. Lua error in package.lua at line 80: module 'strict' not found.
  128. Lua error in package.lua at line 80: module 'strict' not found.
  129. 129.0 129.1 Lua error in package.lua at line 80: module 'strict' not found.
  130. Lua error in package.lua at line 80: module 'strict' not found.
  131. Lua error in package.lua at line 80: module 'strict' not found.
  132. Lua error in package.lua at line 80: module 'strict' not found.
  133. Lua error in package.lua at line 80: module 'strict' not found.
  134. Lua error in package.lua at line 80: module 'strict' not found.
  135. Lua error in package.lua at line 80: module 'strict' not found.
  136. Lua error in package.lua at line 80: module 'strict' not found.
  137. Lua error in package.lua at line 80: module 'strict' not found.
  138. Lua error in package.lua at line 80: module 'strict' not found.
  139. Lua error in package.lua at line 80: module 'strict' not found.
  140. Lua error in package.lua at line 80: module 'strict' not found.
  141. Lua error in package.lua at line 80: module 'strict' not found.
  142. Lua error in package.lua at line 80: module 'strict' not found.
  143. Lua error in package.lua at line 80: module 'strict' not found.
  144. Lua error in package.lua at line 80: module 'strict' not found.
  145. Lua error in package.lua at line 80: module 'strict' not found.
  146. Lua error in package.lua at line 80: module 'strict' not found.
  147. Lua error in package.lua at line 80: module 'strict' not found.
  148. Lua error in package.lua at line 80: module 'strict' not found.
  149. Lua error in package.lua at line 80: module 'strict' not found.
  150. Lua error in package.lua at line 80: module 'strict' not found.
  151. Lua error in package.lua at line 80: module 'strict' not found.
  152. Lua error in package.lua at line 80: module 'strict' not found.
  153. Lua error in package.lua at line 80: module 'strict' not found.
  154. Lua error in package.lua at line 80: module 'strict' not found.
  155. Lua error in package.lua at line 80: module 'strict' not found.
  156. Lua error in package.lua at line 80: module 'strict' not found.
  157. Lua error in package.lua at line 80: module 'strict' not found.
  158. Lua error in package.lua at line 80: module 'strict' not found.
  159. Lua error in package.lua at line 80: module 'strict' not found.
  160. Lua error in package.lua at line 80: module 'strict' not found.
  161. Lua error in package.lua at line 80: module 'strict' not found.
  162. Lua error in package.lua at line 80: module 'strict' not found.
  163. Lua error in package.lua at line 80: module 'strict' not found. Note: The URI used for this reference serves to both describe and perform the test. Therefore, the reference cannot be accessed from revocation-aware browsers.
  164. Lua error in package.lua at line 80: module 'strict' not found.
  165. Lua error in package.lua at line 80: module 'strict' not found.
  166. 166.0 166.1 166.2 166.3 Lua error in package.lua at line 80: module 'strict' not found.
  167. Lua error in package.lua at line 80: module 'strict' not found.
  168. Lua error in package.lua at line 80: module 'strict' not found.
  169. Lua error in package.lua at line 80: module 'strict' not found.
  170. Lua error in package.lua at line 80: module 'strict' not found.
  171. Lua error in package.lua at line 80: module 'strict' not found.
  172. Lua error in package.lua at line 80: module 'strict' not found.
  173. Lua error in package.lua at line 80: module 'strict' not found.
  174. Lua error in package.lua at line 80: module 'strict' not found.
  175. Lua error in package.lua at line 80: module 'strict' not found.
  176. Lua error in package.lua at line 80: module 'strict' not found.
  177. 177.0 177.1 177.2 Lua error in package.lua at line 80: module 'strict' not found.
  178. Lua error in package.lua at line 80: module 'strict' not found.
  179. Lua error in package.lua at line 80: module 'strict' not found.
  180. 180.0 180.1 Lua error in package.lua at line 80: module 'strict' not found.
  181. Lua error in package.lua at line 80: module 'strict' not found.

External links