Django 1.9.3 release notes¶
1 mars 2016
Django 1.9.3 åtgärdar två säkerhetsproblem och flera buggar i 1.9.2.
CVE-2016-2512: Skadlig omdirigering och möjlig XSS-attack via användartillhandahållna omdirigeringsadresser som innehåller grundläggande autentisering¶
Django förlitar sig på användarinmatning i vissa fall (t.ex. django.contrib.auth.views.login()
och i18n) för att omdirigera användaren till en ”on success” URL. Säkerhetskontrollen för dessa omdirigeringar (nämligen django.utils.http.is_safe_url()
) ansåg att vissa webbadresser med grundläggande autentiseringsuppgifter var ”säkra” när de inte borde vara det.
Till exempel skulle en URL som http://mysite.example.com\@attacker.com
betraktas som säker om värdadressen för begäran är http://mysite.example.com
, men om användaren omdirigeras till denna URL skickas användaren till attacker.com
.
Om en utvecklare förlitar sig på is_safe_url()
för att tillhandahålla säkra omdirigeringsmål och lägger in en sådan URL i en länk, kan de också drabbas av en XSS-attack.
CVE-2016-2513: Uppräkning av användare genom tidsskillnad vid uppgradering av lösenordshashers arbetsfaktor¶
I varje större version av Django sedan 1.6 har standardantalet iterationer för PBKDF2PasswordHasher
och dess underklasser ökat. Detta förbättrar lösenordets säkerhet när hårdvarans hastighet ökar, men det skapar också en tidsskillnad mellan en inloggningsbegäran för en användare med ett lösenord kodat i ett äldre antal iterationer och inloggningsbegäran för en icke-existerande användare (som kör standardhasherens standardantal iterationer sedan Django 1.6).
Detta påverkar endast användare som inte har loggat in sedan iterationerna höjdes. Första gången en användare loggar in efter en ökning av iterationerna uppdateras lösenordet med de nya iterationerna och det finns inte längre någon tidsskillnad.
Den nya metoden BasePasswordHasher.harden_runtime()
gör det möjligt för hashare att överbrygga körtidsgapet mellan arbetsfaktorn (t.ex. iterationer) som tillhandahålls i befintliga kodade lösenord och standardarbetsfaktorn för hasharen. Den här metoden är implementerad för PBKDF2PasswordHasher
och BCryptPasswordHasher
. Antalet rundor för den senare hasharen har inte ändrats sedan Django 1.4, men vissa projekt kan underklassa den och öka arbetsfaktorn efter behov.
En varning kommer att skickas ut för alla tredjeparts lösenordshashers som inte implementerar en harden_runtime()
metod.
Om du har olika lösenordshashar i din databas (t.ex. SHA1-hashar från användare som inte har loggat in sedan standardhashern bytte till PBKDF2 i Django 1.4) kan tidsskillnaden på en inloggningsbegäran för dessa användare vara ännu större och den här fixen avhjälper inte den skillnaden (eller någon skillnad när du byter hasher). Du kanske kan uppgradera dessa hasher för att förhindra en tidsattack i det fallet.
Buggrättningar¶
Hoppade över URL-kontroller (nytt i 1.9) om inställningen
ROOT_URLCONF
inte är definierad (#26155).Fixade en krasch på PostgreSQL som förhindrade användning av
TIME_ZONE=None
ochUSE_TZ=False
(#26177`).Lagt till systemkontroller för kollisioner mellan frågenamn i dolda relationer (#26162).
Åtgärdade en regression för fall där
ForeignObject.get_extra_descriptor_filter()
returnerade ettQ
-objekt (#26153).Åtgärdad regression med en
__in=qs
-uppslagning för enForeignKey
medto_field
inställd (#26196).Gjorde
forms.FileField
ochutils.translation.lazy_number()
picklable (#26212).Fixat
RangeField
ochArrayField
serialisering medNone
värden (#26215).Fixade en krasch vid filtrering av en
Decimal
iRawQuery
(#26219).Tillåter bindestreck i toppdomännamn för URL:er som kontrolleras av
URLValidator
för att åtgärda en regression i Django 1.8 (#26204).Fixade några kraschande deprecation shims i
SimpleTemplateResponse
som regredierade i Django 1.9 (#26253).Fixade
BoundField
så att det inte längre är tillåtet att dela upp subwidgets (#26267).Ändrade admins meddelande ”permission denied” i inloggningsmallen till att använda
get_username
istället förusername
för att stödja anpassade användarmodeller (#26231).Fixade en krasch när ett icke-existerande mallnamn skickades till den cachade mallinläsarens
load_template()
-metod (#26280).Förhindrade
ContentTypeManager
-instanser från att dela sin cache (#26286).Återställde en ändring i Django 1.9.2 (#25858) som förhindrade att relativa lazy-relationer definierade på abstrakta modeller skulle lösas enligt deras konkreta modells
app_label
(#26186).