A Cristian Zapata own goal was followed up quickly by Paulo Dybala's strike to give the Sicilian side all three points from the game at San Siro
The Colombian came off the bench in the third minute for the injured Alex, but soon found himself in the spotlight for the wrong reasons.
After heading into his own net from a corner, the defender was easily brushed aside by Paulo Dybala as the Palermo striker doubled his side's lead after just 26 minutes.
Milan pushed desperately to reduce the deficit at a sparsely populated San Siro, but found their opportunities limited and quality in the final third lacking.
The defeat is just Milan's second under coach Filippo Inzaghi, but sees their winless run stretch to three matches following draws against Fiorentina and Cagliari.
Milan kept faith with Fernando Torres despite the Spaniard's disappointing goalscoring record since arriving in Serie A, while Jeremy Menez was added to an attacking line that also featured Keisuke Honda, but it was the visitors who made the early chances.
Franco Vazquez punished a defensive lapse to break clear and draw a one-handed save from Diego Lopez inside the opening two minutes, and Milan were dealt a blow when defender Alex had to leave the field through injury soon after.
Andrea Poli was sent through on goal after 13 minutes, but prodded wide of the left-hand post under pressure from both goalkeeper Stefano Sorrentino and the Palermo defence, with home appeals for a penalty waved away by the referee.
Torres glanced a header across the face of goal from a free kick after 16 minutes as Milan threatened to take control of the match, but Achraf Lazaar had Lopez sprawling with a low drive from distance seven minutes later.
From the resulting corner, Zapata inadvertently headed into his own net.
Palermo should have extended their lead when Dybala went clean through on goal moments later, only for Lopez to make the block, but the forward made no mistake with his next opportunity in the 26th minute.
The 20-year-old Argentine outmuscled Zapata and left the defender for dead before lifting the ball over Lopez and into the back of the net.
Palermo offered no let-up - Edgar Barreto testing Lopez with a curling effort from 20 yards before Ezequiel Munoz headed narrowly wide from a corner.
Inzaghi introduced Stephan El Shaarawy in place of Poli for the second half and the 22-year-old was straight into the thick of the action as he picked up a booking for a blatant dive in the Palermo penalty area.
The Italy international then curled wide from 20 yards as Milan desperately chased a goal, and Torres did little to enhance his own stuttering reputation by heading another effort wide of the target.
Nigel de Jong's 25-yard free-kick 10 minutes from time was comfortably collected by Sorrentino as Palermo eased to a first away victory since gaining promotion last term.