The Russian side, who have been forced to play three Champions League home games behind closed doors after racist behaviour from their travelling fans in Rome in September, came back from seemingly nowhere to leave City with a mountain to climb to reach the knockout stages.
Sergio Aguero scored his eighth goal in his last five games just before the half-hour mark to give the visitors a lead that looked to have eased a few City nerves.
James Milner followed up a scuffed Aguero effort to double City’s lead before half-time, and exert further control on the match.
However, with the visitors firmly in cruise control, the home side kept plugging away, and got their reward when substitute Seydou Doumbia tapped into to make the game more of a contest.
City were on the back foot for the rest of the second-half, with the hosts having several openings to unsettle the Premier League champions, but it seemed City had done enough to hold on.
However, Hungarian referee Istvan Vad pointed to the spot for a foul on Doumbia by Aleksandar Kolarov with just four minutes remaining, with City players left furious over what seemed like a harsh decision.
Bibras Natkho held his nerve to earn the home side a point from the spot, and deny City a much-needed win.
With just two points from their opening three group matches, City now face a tall order to qualify for the last 16, and may have to win all three of their remaining games to progress.
The home side did begin brightly, with Ahmed Musa and former Manchester United winger Zoran Tosic coming close with speculative efforts from long range.
Pablo Zabaleta had City’s best chance early on, bringing down a long ball over the top brilliantly, cutting inside, but fired just wide with CSKA ‘keeper Igor Akinfeev beaten.
The deadlock was broken thanks to some very unselfish play from Edin Dzeko, who when bearing down on goal, elected to square the ball to the onrushing Sergio Aguero, who had the simple task of tapping the ball into an empty net.
Dzeko himself almost got on the scoresheet, but was denied by a smart save from Akinfeev. However, it wasn’t long before City extended their lead.
Ageuro again was in the thick of it, picking up a knock-down from Zabaleta, and although he may have been going for goal, Milner nipped in to stab home Aguero’s scuffed effort to double City’s lead.
City almost had a third before the interval as Kolarov fed Dzeko from the left. Dzeko appeared to be impeded as he weighed up a shot – and possibly could have gone down for a penalty – and the ball ran through to Milner, who hit the post from a tight angle.
After the break City certainly took their foot off the gas, and were put under the cosh with substitute Doumbia adding much more potency to the CSKA forwardline.
Roman Eremenko was inches away from levelling as he met a Georgi Schennikov knock-down with a shot on the half-volley that flew just over.
The pressure from CSKA mounted and City were breached after 64 minutes when Musa broke free down the right and pulled the ball back for substitute Doumbia to bundle in.
Then, just as City looked to have done enough after making several changes to shore up their midfield, the Hungarian referee gifted the home side a lifeline.
Doumbia seemed to have gone down very theatrically under challenge from Kolarov, who looked to have made minimal contact, but as City played on, referee Vad pointed to the spot.
Natkho converted the resulting penalty, just beating Hart’s full stretch dive to his left to earn his side a point at the death – a result that does little for either side’s chances of progression.