.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _cve/2010-0009:

=========================================================
CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability
=========================================================

:Date: 31.03.2010

:Affected: Apache CouchDB 0.8.0 to 0.10.1

:Severity: Important

:Vendor: The Apache Software Foundation

Description
===========

Apache CouchDB versions prior to version :ref:`0.11.0 <release/0.11.0>` are
vulnerable to timing attacks, also known as side-channel information leakage,
due to using simple break-on-inequality string comparisons when verifying hashes
and passwords.

Mitigation
==========

All users should upgrade to CouchDB :ref:`0.11.0 <release/0.11.0>`.
Upgrades from the :ref:`0.10.x <release/0.10.x>` series should be seamless.
Users on earlier versions should consult with
:ref:`upgrade notes <release/0.10.x/upgrade>`.

Example
=======

A canonical description of the attack can be found in
http://codahale.com/a-lesson-in-timing-attacks/

Credit
======

This issue was discovered by *Jason Davies* of the Apache CouchDB development
team.
