Окончил географический факультет Московского государственного университета (МГУ; 1970, с отличием), аспирантуру МГУ. Кандидат географических наук (1974).
В 1970—1974 — аспирант, младший научный сотрудник географического факультета МГУ. В 1974—1975 — старший геолог Московской геолого-гидрогеологической экспедиции. В 1975—2005 — старший научный сотрудник, ведущий научный сотрудник географического факультета МГУ. Автор более 150 научных работ по географии, геохронологии и палеогеографии. Соавтор методики датирования горных пород — РТЛ геохронологии. Участник многочисленных экспедиций по СССР и России.
С 1981 — член КПСС. Избирался секретарём парткома географического факультета МГУ, членом парткома МГУ (секретарём парткома был Иван Мельников), членом Ленинского райкома КПСС (1989—1991). После запрета КПРФ в 1991 участвовал в воссоздании коммунистической организации в МГУ (вместе с Мельниковым). Входил в состав городской думы Русского национального собора (1993—1994). С апреля 1997 — член Центрального комитета (ЦК) КПРФ. С 2002 по 2008 — секретарь ЦК КПРФ по информационно-аналитической работе. С 2004 по 2008 — член президиума ЦК КПРФ и секретарь ЦК КПРФ по информационно-аналитической работе и проведению выборных кампаний.
С 16 июня 2006 — депутат Государственной думы четвёртого созыва (избран по списку КПРФ, №2 в Северной региональной группе, получил мандат взамен выбывшего депутата — скончавшегося 29 мая 2006 года Владимира Александровича Казаковцева), член фракции КПРФ и Комитета по труду и социальной политике. С 2007 — депутат Государственной думы пятого созыва (избран по списку КПРФ, № 1 по Пермскому краю), член фракции КПРФ, член Комитета Государственной Думы по охране здоровья.
Не вошёл в следующий состав президиума и секретариата ЦК из-за поддержки Фёдорова и его помощника Семена Борзенко во время так называемого «Ленинградского дела».